Vue(3)|青训营笔记

63 阅读1分钟

这是我参与「第四届青训营 」笔记创作活动的的第7天

1、父子组件之间的通信

  • 通过props向子组件传递数据;父==>子
  • 通过(自定义)事件向父组件发送消息;子==>父

1.1 props的基本用法(父组件向子组件传递数据 )

在组件中,使用选项props来声明需要从父级接收到的数据

props的值有两种方式:

方式一:字符串数组,数组中的字符串就是传递时的名称;

//父==>子
<body>
    <div id="app">
      <cpn :cbooks="books" :message="msg"></cpn>
    </div>
    <template id="cpn1">
      <div>
      <h2 v-for="item in cbooks">{{item}}</h2>
      <p>{{message}}</p>
      </div>
    </template>
    <script>
        const cpn = Vue.extend({
        template:'#cpn1',
        props:['cbooks','message']
      })
      const App = new Vue({
        el:'#app',
        data: {
          books:['《算法导论》','《UNIX编程艺术》','《计算机网络》','《操作系统》'],
          msg:"zwx"
        },
        components:{
          cpn
        }
      })
    </script>
  </body>

方式二:对象,对象可以设置传递时的类型,也可以设置默认值等;

1.2 子传父

<body>
<div id="app">
<!-- 子组件发送事件 父组件在此监听事件 以前v-on监听的默认事件click、touch begin事件 
现在也可以监听子组件发射过来的自定义事件 -->
<cpn @itemclick = "cpnClick()"></cpn>
</div>

<template id="cpn1">
<!-- 这里为什么必须需要一个div???  -->
<div>
<!-- 子组件谁被点击了 将事件传递给父组件 -->
<button v-for="item in categories" @click="itemclick(item)">{{item.name}}</button>
</div>
</template>

<script>
//子组件
const cpn = Vue.extend({
emplate:'#cpn1',
data(){
return{
categories:[
	{id:1, name:'热门推荐'},
	{id:2, name:'潮流男装'},
	{id:3, name:'智能家居'},
	{id:4, name:'生活用品'},
  ]}
},
methods:{
itemclick(item){
// console.log(item);
// 子组件向父组件发送一个事件this.$emit('发送事件名称',传递参数)
this.$emit('itemclick',item);
}
}
})
//父组件
const App = new Vue({
el:'#app',
data: {},
components:{cpn},
methods:{
cpnClick(item){console.log('123');}
}
})
</script>

</body>

自定义事件的流程:

  • 在子组件中。通过$emit()来触发事件;
  • 在父组件中,通过v-on来监听子组件的事件;

1.3 子访问父

  • parent开发中一般不会使用,因为一个子组件可以多次复用,是多个父组件的子组件,当使用parent开发中一般不会使用,因为一个子组件可以多次复用,是多个父组件的子组件,当使用parent进行访问父组件中的某个属性时,很难保证所有父组件都拥有这个属性,会导致报错。也会使父子组件耦合性太高
  • $root 访问根组件 访问Vue实例

1.4 父访问子

  • children或者children 或者 refs

  • $children使用的比较少,因为它是通过数组下标来获取父组件中的所有子组件,一旦在目标组件 之前插入一个新的子组件,目标组件的下标值就会 发生改变

  • 一般在开发中使用$refs

    (1)需要先在子组件上加ref属性

    (2) 默认是一个空对象,在子组件上加了ref后,在父组件中可以使用