Vue 组件化编码之父子组件传值与自定义事件

136 阅读2分钟

1. Vue组件化编码流程:

 1.1 拆分静态组件:组件要按功能拆分,命名不能与html元素冲突  
 1.2 实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:  
     (1)一个组件在用:放在组件自身即可。  
     (2)一些组件在用:放在他们共同的父组件上(状态提升)  
 1.3 实现交互,从绑定事件开始  
 

2. 父子组件传值

2.1. 父组件给子组件传值: 给子组件绑定属性或事件,子组件用props接收

    // toDoList为父组件传递给子组件的数组,供子组件使用
    <my-list :todolist="toDoList" :deleteTodo="deleteTodo"/>

2.2. props适用于:
2.1 父组件 => 子组件 通信
2.2 子组件 => 父组件 通信(要求父组件先给子组件一个函数)

2.3. 使用v-model要切记:v-model绑定的值不能是props传过来的值,因为props的值是不可以修改的
2.4. props传过来的值若是对象类型的值,修改对象中的属性时vue不会报错,但是不推荐这样做

2.5. 子组件给父组件传值的方式:

```
1 通过父组件给子组件传递函数类型的props实现:
// deleteTodo为一个函数,定义在使用my-list的组件(父组件)中,同时给my-list绑定了deleteTodo事件,在my-list中需要用props接收,并在需要使用的地方调用,触发父组件中的逻辑
<my-list :todolist="toDoList" :deleteTodo="deleteTodo"/>
```
2 通过父组件给子组件绑定一个自定义事件实现

```
// 绑定事件的两种形式:ref  或者  @(v-on)
// 1. 用@(v-on)给子组件绑定一个自定义事件addTodo事件
<my-header @addTodo="addTodo" />

// 2. 用ref给子组件绑定一个自定义事件addTodo事件
// 添加引用
<my-header ref='header' />
// 绑定事件
this.$refs.header.$on('addTodo', this.addTodo)

// 子组件需要用$emit方法触发自定义事件
// $emit函数的参数:第一个参数是函数名,后边可以追加很多参数,一次接收:getName(a,b,c),或者以数组形式接收:getName(...para),para接收数组类型数据
this.$emit('addTodo', todoObj)
```
注意,若果想让自定义事件只触发一次,可以使用once修饰符或$once方法
```
// 只触发一次
// 1. once
<my-header @addTodo.once="addTodo" />
// 2. $once
this.$refs.footer.$once('clearDone', this.clearDone)
```

2.6. 自定义事件的原生事件调用:
组件中的事件默认都是自定义事件,需要用$emit触发,如果想使用原生事件,需要用native关键字,且该自定义事件绑定在template的根元素上

<!-- 使用native关键字声明使用的click事件是原生事件-->
<my-header @addTodo="addTodo" @click.native="showMsg"/>

2.7. 自定义事件的解绑

// 解绑一个事件
this.$off('addTodo')

// 解绑多个事件
this.$off(['addTodo'])

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