04 Vue属性配置

news2024/11/27 18:41:08

1、ref属性

 App.vue代码:

<template>
    <div>
      <h1 v-text="msg" ref="myTitle"></h1>
      <button @click="showDom">点我输出上方的DOM元素</button>
      <school ref="school" id="sch"/>
    </div>
</template>

<script>
import School from "@/components/School";
export default {
  name: "App",
  components: {School},
  data() {
    return { msg: "学习vue"}
  },
  methods: {
    showDom() {
      //通过ref绑定可以获得dom或者vue组件实例对象
      console.log(this)
      console.log(this.$refs)
      console.log(this.$refs.myTitle)  //html标签,获得真实dom元素,
      console.log(this.$refs.school)   //ref绑定组件,获得子组件的实例对象
      console.log(document.getElementById('sch')) //如果给绑定ID,通过document可以获取完整的dom对象
    }
  }
}
</script>

样式:

 通过控制台输出: 可以看到通过ref属性:可以非常方便的获得vue组件中子组件的实例对象,这个在后面组件之间通信非常重要;

2、props配置

一个组件被多次使用的时候,vue实例的数据不一致,实例化的时候传入数据

2.1 数组方式定义props 

 定义 Student.vue 组件

<template>
  <div class="student">
    <h1 v-text="msg"></h1>
    <h2>学生姓名: {{name}}</h2>
    <h2>学生性别:  {{sex}}</h2>
    <h2>学生年龄: {{age}}</h2>
  </div>
</template>

<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Student",
  data () {
    return {
      msg:"我在学习vue",
    }
  },
  props: ["name","age","sex"]
}
</script>

初始化组件实例的时候

<template>
    <div>
      <student name="acong" age="19" sex="女"/>
      <hr/>
      <student  name="azhu" age="20" sex="男"/>
      <hr/>
    </div>
</template>

效果:

 查看vue实例

 数组方式接受的只能是字符串的类型:

age=”18+1“ 这种方式传递的也是字符串,不做运算。 

如果通过`<student name="acong" :age="18+1" sex="女"/>` 方式传递,就会出现计算的结果;

2.2 限制类型接受参数

<template>
  <div class="student">
    <h1 v-text="msg"></h1>
    <h2>学生姓名: {{name}}</h2>
    <h2>学生性别:  {{sex}}</h2>
    <h2>学生年龄: {{age}}</h2>
  </div>
</template>

<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Student",
  data () {
    console.log(this)
    return {
      msg:"我在学习vue",
    }
  },
  // props: ["name","age","sex"]
  props: {
    name: String,
    age: Number,
    sex: String,
  }
}
</script>

 标准的写法:

  //进行类型和默认值,是否必须的配置
  props: {
    name: {
      type:String,
      required: true,
    },
    age: {
      type: Number,
      default:18
    },
    sex: {
      type: String,
      required: true
    },
  }

外部接受的prop中参数是不建议更改的:

  methods: {
    changeAge() {
      // eslint-disable-next-line vue/no-mutating-props
      this.age = 30
    }
  }

增加点击事件修改: 刷新界面修改可以成功,但是控制台会报错,所以不建议修改props传入的值,可能会造成vue其他的一些位置问题。

 如果业务需求就是要改: 点击年龄增加,需求: 重新定一个新的变量,接受传入的值,对新定义的值做修改,就是可以实现修改传入的值。

注意事项:

1、如果data中定义的属性名字和props中定义的一样,props中的会优先,覆盖data中定义的值,

2、props中定义的属性不能是key,ref等被vue使用的作为节点标识的属性,

Student.vue

<template>
  <div class="student">
    <h1 v-text="msg"></h1>
    <h2>学生姓名: {{name}}</h2>
    <h2>学生性别:  {{sex}}</h2>
    <h2>学生年龄: {{myage+1}}</h2>
    <button @click="changeAge">尝试修改年龄</button>
  </div>
</template>

<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "Student",
  data () {
    console.log(this)
    return {
      msg:"我在学习vue",
      myage: this.age
    }
  },
  // props: ["name","age","sex"]
  // props: {
  //   name: String,
  //   age: Number,
  //   sex: String,
  // }
  //进行类型和默认值,是否必须的配置
  props: {
    name: {
      type:String,
      required: true,
    },
    age: {
      type: Number,
      default:18
    },
    sex: {
      type: String,
      required: true
    },
  },
  methods: {
    changeAge() {
      // eslint-disable-next-line vue/no-mutating-props
      this.myage++
    }
  }
}
</script>

3、mixin混入

3.1 局部混合

两个组件中的方法一样,可以优化提取为一个,分别引用;

可以定义个公共的js文件

在组件中引入:

 刷新界面: 测试两个组件的绑定方法都正常的:

混合中可以写很多内容:  组件定义的中的都可以被混合

export const common ={
    methods: {
        showName() {
            alert(this.name)
        }
    },
    mounted() {
        console.log("你好啊!")
    },
}

export const common2 = {
    data() {
        return {
            x:20,
            y:"yyy"
        }
    }
}

导入混合

 刷新界面可以看到: common2 中定义的 x,y属性与原来的data中的属性进行了合并:定义的钩子函数也被两个组件引用了。 

如果混合定义了x,组件中data也有x, 有冲突情况下:以组件中定义的x为准,混合中定义的x被丢弃; 方法和data是这个标准,

但是如果混合中有生命周期钩子函数,钩子函数都会被执行。组件中定义的后执行,混合中定义的先执行。

3.2全局混合

在组件中不做任何引入混合,在main.js中引入

import Vue from "vue";
import App from "@/App";

Vue.config.productionTip = false

import {common,common2} from "@/common";

Vue.mixin(common)
Vue.mixin(common2)

new Vue({
    render: h=> h(App),
}).$mount("#app")

会让所有的组件都引入混合,刷新界面看到你好啊执行四次:为什么是四次呢?看vue

一共有四个组件实例,root上也绑定了,x,y属性

全局混合实际上有很多弊端,范围太大了,实际上最多使用的还是局部混合。

4、Vue插件

插件可以增强Vue,插件实际上就是对象。

定义插件

 在main.js 中应用

import Vue from "vue";
import App from "@/App";
//导入插件
import plugin from "@/plugin";

Vue.config.productionTip = false

//应用插件
Vue.use(plugin)

new Vue({
    render: h=> h(App),
}).$mount("#app")

 在插件中传递参数

export default {
    install(vue) {
        console.log("@@@install:",vue)
    }
}

运行发现: 这个默认的参数vue是,vm的构造函数

 

 在vm的构造函数中可以做很多事;

export default {
    install(Vue) {
        console.log("@@@install:",Vue)

        //配置全局过滤器
        Vue.filter('myFilter',function (val) {
            return val.slice(0,4)
        })

        //定义全局指令
        Vue.directive('fbind', {
            bind(element, binding) {
                console.log('bind')
                element.value = binding.value
            },

            // eslint-disable-next-line no-unused-vars
            inserted(element, binding) {
                console.log('insert')
                element.focus()
            },
            update(element, binding) {
                console.log('update')
                element.value = binding.value
            }
        })

        //混入
        Vue.mixin({
            data() {
                return {
                    x:20,
                    y:"yyy"
                }
            }
        })
        //给Vue原型上添加一个方法,vm和vc都可以使用
        Vue.prototype.hello = ()=> {alert("你好啊! 哈哈")}
    }
}

验证:

# 组件中可以使用全局添加的过滤器
 <h2 >学校名字: {{name | myFilter }}</h2>
# 组件中可以使用自定义的全局绑定
<input type="text" v-fbind:value="name">
# 组件中使用hello方法
 <button @click="test">测试hello方法</button>
 test() {
      this.hello()
    }

 混合检查

 外部定义的插件,可以定义很多过滤器或者很多优秀的方法,可以直接使用。应用插件可以传递多个参数 Vue.use(plugin,x1,x2,x3) 都会被定义的 plugin.js 接收到

 5、scoped样式

vue组件中的样式,最终会汇总到一起,class名字定义有可能冲突,谁后导入就是用谁的。

解决问题,style样式要加入scoped,就会不会冲突。

app组件中定义的style样式有可能不需要加scoped,app组件中定义的样式有可能是全局的样式。

lang指定默认是: css,可以指定为:less, less 编译需要报错。

安装:webpack 版本适配less-loader版本

需要安装 npm install less-loader

<style scoped lang="less">
  .student{
    background-color: orange;
    .name-style {
      font-size: 40px;
    }
  }
</style>

效果:

6、案例:todolist

 github仓库:后面添加

7、组件的自定义事件

7.1  自定义事件的创建和绑定

子组件向父组件的传递数据

1、通过父亲组件定义一个方法,通过props传递给子组件,子组件调用传递的方法,可以将数据传递给父组件

2、父组件给子组件绑定一个自定义事件,在子组件通过 ths.$emit("自定义事件名",参数) , 触发父组件的事件回调绑定的方法,将子组件的数据传递给父组件

# 1、绑定事件
<Student v-on:getStudentName="getStudentName"/>
# 简写 <Student v-on:getStudentName="getStudentName"/>
# 2、定义事件方法
  methods: {
    getStudentName(name) {
      console.log("studentName",name)
    }
  }
# 3、在子组件触发事件this.$emit('事件名')
<button @click="sendStudentName">发送学生姓名</button>
methods: {
    sendStudentName() {
      this.$emit("getStudentName",this.name)
    }
  } 

另一种更加灵活的绑定事件的方式:可以给绑定事件的时候做一些其他事。

# 1、将子组件通过ref属性命名
<Student ref="student"></Student>
# 2、在父组件通过 mounted 钩子函数给绑定
mounted() {
    setTimeout(()=> {
            this.$refs.student.$on('getStudentName',this.getStudentName)
        },3000)
  }

# 3、在子组件中触发
<button @click="sendStudentName">发送学生姓名</button>
methods: {
    sendStudentName() {
      this.$emit("getStudentName",this.name)
    }
  } 

如果是事件单次触发:v-on:getStudentName.once或者this.$refs.student.$once('getStudentName',this.getStudentName)

7.2  自定义事件解绑

解绑自定义事件:

//解绑一个自定义事件
this.$off('getStudentName')

//解绑一个多个自定义事件
this.$off(['getStudentName','demoEvent'])

//解绑所有自定义事件
this.$off()

//销毁组件实例,组件及其子组件绑定的所有自定义事件也会解绑

自定义事件注意点:

1、ref 属性绑定的时候,mounted中的  this.$refs.xxx.$on('getStudentName',回调函数)

 回调需要写成箭头函数,或者直接写在methods,如果直接写 function 函数名,函数名中的this代表子组件。

3、绑定事件为原生事件的时候需要加.native

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js | Express+MongoDB 实现简易用户管理系统(一)(项目搭建 | RESTful API架构 | 前后端交互)

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

【javaEE】多线程进阶(Part1 锁策略、CAS、synchronized )

目录前言/补充4. 描述一下线程池的执行流程和拒绝策略有哪些&#xff1f;【面试题&#xff01;】一、常见锁策略一&#xff09;乐观锁VS悲观锁二&#xff09;读写锁VS普通互斥锁三&#xff09;重量级锁VS轻量级锁四&#xff09;自旋锁VS挂起等待锁五&#xff09;公平锁VS非公平…

Vue框架背后的故事

文章目录前言Vue萌芽Vue名字的由来因着Vue免试进入MeteorVue逐步完善Taylor推荐VueVue因受质疑发布1.0LinusBorg加入萌生全职做Vue想法Vue在恰到好处的时机出现探索经济来源Serah Drasner加入全职投入Vue建设Vue引入国内Vue受拥国内Vue在决策背景方面的独有优势总结本期推荐前言…

JVM垃圾回收系列之垃圾收集器二

随笔 最近两个星期因为要忙公司项目上线的事情以至于发表的文章会显得碌碌庸流&#xff0c;在此以示歉意 引言 本文将介绍HotSpot中的G1GC 参考书籍&#xff1a;“深入理解Java虚拟机” 个人java知识分享项目——gitee地址 个人java知识分享项目——github地址 G1GC 介…

双向链表的操作

什么是双向链表&#xff1f; 指针域&#xff1a;用于指向当前节点的直接前驱节点&#xff1b; 数据域&#xff1a;用于存储数据元素。 指针域&#xff1a;用于指向当前节点的直接后继节点&#xff1b; typedef struct line{struct line * prior; //指向直接前趋&#xff0c;结…

超级简单的机器学习入门

超级简单的机器学习入门 文章目录超级简单的机器学习入门0.写在前面1.机器学习基本概念2.机器学习算法的类型2.1 监督学习2.2 无监督学习2.3 监督学习和无监督学习的对比2.4 强化学习3.机器学习的三个基本要素3.1 模型3.2 学习准则3.2.1 损失函数3.2.2 欠拟合和过拟合&#xff…

MySQL数据库 || 增删改查操作详解

目录 前言&#xff1a; 插入数据 查询数据 全列查询 指定列查询 带表达式查询 去重查询 查询结果排序 条件查询 比较运算符 逻辑运算符 示例 模糊查询 示例 空值比较 分页查询 修改数据 删除数据 注意&#xff1a; 前言&#xff1a; &#x1f388;增删改查…

Flutter——常用布局

Flutter—常用布局效果图widget 树形图左布局Text评分条提示内容右布局应用Stack布局效果图释示例效果图释电影封面电影信息电影演员电影简介应用效果图 widget 树形图 整个界面由一行组成&#xff0c;分为两列&#xff1b;左列包括电影介绍&#xff0c;由上到下垂直排列&…

java计算机毕业设计ssm+jsp线上授课系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习线上授课的相关知识以及网络提供的技术应用教程&#xff0c;以线上授课的实际应用需要出发&#xff0c;架构系统来改善现线上授课工作流程繁琐等问题。不仅如此以操作者的角度来说&#xf…

【JavaSE】关于数组

文章目录数组的创建与初始化数组的初始化静态初始化动态初始化数组的存储null打印数组的三种方式循环遍历打印foreach打印Arrays.toString()打印数组的练习冒泡排序常用的API数组拷贝Arrays.copyOf()数组排序Arrays.sort()数组的快速初始化Arrays.fill()二维数组数组的创建与初…

mysql之MHA的高可用

一、MHA概述 1.什么是 MHA&#xff1a; MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作…

1分钟完成在线测试部署便捷收集班级同学文件的web管理系统

最近CSDN推出了一个新功能【云IDE】&#xff0c;个人对这个新功能(比赛奖金 )挺感兴趣的&#x1f92d;&#xff0c;于是瞬速地拿之前自己搞的一个便捷收集班级同学文件的web管理系统&#xff08;下面简称该项目为cfile&#xff09;体验了一下&#xff0c;发现功能还是挺好用的&…

Node.js 实战 第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 1.6 总结

Node.js 实战 文章目录Node.js 实战第1章 欢迎进入Node.js 的世界1.5 三种主流的Node 程序1.5.1 Web 应用程序1.5.2 命令行工具和后台程序1.5.3 桌面程序1.5.4 使用Node 的应用程序1.6 总结第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 Node 程序主要可以分成三种类…

某网站视频播放花屏解密

某网站视频播放花屏解密样例网址&#xff1a;aHR0cHM6Ly90di5jY3R2LmNvbS8yMDIyLzA5LzMwL1ZJREVnZ0ZRYmZ6NmlMeXZjN0F4d0NlZjIyMDkzMC5zaHRtbA 站内之前也曾经发过相关的问题 1.CCTV视频m3u8视频下载&#xff0c;下载下来时长正确&#xff0c;有声音&#xff0c;但是画面是马…

聚沙成塔【45天玩转uni-app】初探uni-app

文章目录写在前面DCloud当下跨平台开发存在的问题为什么选择uni-app写在最后写在前面 聚沙成塔——每天进步一点点&#xff0c;大家好我是几何心凉&#xff0c;不难发现越来越多的前端招聘JD中都加入了uni-app 这一项&#xff0c;它也已经成为前端开发者不可或缺的一项技能了&…

ROS1可视化利器---Webviz

0. 简介 对于ROS1而言&#xff0c;rqt和plotjuggler是我们最常用的工具&#xff0c;这两个工具&#xff1a;rqt中嵌入了很多有用的小工具&#xff0c;但是它需要播放离线包&#xff0c;没有办法对离线包进行实时的分析。而plotjuggler支持对离线bag包进行分析&#xff0c;但是…

[C语言、C++]数据结构作业:用递归实现走迷宫(打印正确通路即可)

如果是非递归情况 如果当前点&#xff08;方格&#xff09;为出口&#xff0c;则成功退出 &#xff08;否则&#xff09; 如果可继续走(向相邻点试探)&#xff0c;存在某个可前进 的相邻点(分支)则&#xff1a; 1、将当前点保存&#xff0c;以便回退 2、将相邻点作为当前点…

【数据结构】排序3——交换排序(冒泡排序、快速排序)

文章目录交换排序冒泡排序冒泡排序算法算法分析快速排序改进后的快速排序算法算法分析交换排序 【基本思想】 两两比较&#xff0c;如果发生逆序则交换&#xff0c;直到所有记录都排好序为止。 常见的交换排序方法&#xff1a; 冒泡排序T(n)O(n2) 快速排序T(n)O( nlog2n) 冒…

SpringSecurity Oauth2实战 - 06 获取用户登录信息并存储到本地线程

文章目录1. 获取用户登录信息1. 用户信息共享的ThreadLocal类 UserInfoShareHolder2. 写一个拦截器 UserInfoInterceptor3. 配置拦截器 CommonWebMvcAutoConfiguration2. 源码分析1. 认证用户通过access_token访问受限资源2. 进入过滤器 OAuth2AuthenticationProcessingFilter#…

源码分析:Transport 开发

有关 transport 相关队列的调用过程: 【T ransportService 】 TransportService.java 的所有接口由 DefaultTransportService.java 实现,里面包含四种接口: (1)发送到 ruleEngine 发送 TbProtoQueueMsg<ToRuleEngineMsg> 消息。 由 DefaultTbRuleEngineConsumerServic…