当前位置: 首页 > Web前端 > vue.js

Vue组件通讯方式

时间:2023-03-31 19:37:43 vue.js

父组件到子组件通过子组件的props选项传值接受父组件传来的值props中的数据可以直接在模板中使用注意:props不能相同name作为数据,会造成覆盖问题子组件设置方法Vue.component('my-com',{props:['title'],//propertytobeboundintheparentclasstemplate:'{{title}}'})父组件设置方法为自定义组件设置属性//Static属性设置,不能被操作修改//动态属性设置:表达式(一般静态值不通过动态属性绑定,且不可修改)//动态属性设置:data(父组件数据更新会使子组件更新同步ly)

newVue({...data:{item:{title:"实力内容3"}},components:{"my-com":{props:["title"],template:`

{{title}}

`}}})Props命名规则建议使用camelCase进行prop命名,使用kebab-case进行父组件绑定。为什么?子组件中,如果props中使用了kebab-case,prop作为属性时不能加"-",prop为"my-title"时需要改为"{{myTitle}}"使用时的插值在处理父组件时,属性是用html写的,而html属性是不区分大小写的,所以camelCase会被识别为camelcase,这可能不是我们想要的camel-case。得到的子组件Vue.component("my-com",{props:["myTitle"],//{myTitle:String}也可以这样写template:`

{{myTitle}}

//除了在slot中使用,还可以用于绑定动态属性
`})父组件
从父到子的单向数据流父子组件之间的所有props都是单向向下绑定的。这意味着它只能从父母传递给孩子,不能逆转(孩子影响父母)。说明:父组件的数据修改会自动绑定到子组件,子组件会更新。子组件的操作不能反向影响父组件。处理prop数据时,需要将子组件存入data或计算后运行Vue.component("my-com",{props:['initialTitle'],template:'

{{myTitle}}

',data(){return{myTitle:this.initialTitle//保存属性,处理后放入插值}}})
varvm=newVue({data:{value:'WelcometoBeijing',},}).$mount("#app")组件也是一个vue实例,不管instance如何修改myTitle的属性,如何改变myTitle的数据,不会影响parent的数据。处理props数据的方法,this.myTitle="othercontent"直接修改props数据会产生警告this.initialTitle="othercontent",建议使用data或者computed而不是直接修改(我没有出现).注意,如果prop是数组或对象,子组件的操作会影响父组件的状态。(引用)解决办法是保存下来复制到一个对象操作,obj_:Object.assign({},this.obj)对象不是整体传递的

{{obj.name}}

//会受到影响
varvm=newVue({data:{obj:{name:'mcgee',//会受到1age:18}},}).$mount("#app")Vue.component("my-com",{props:['initialObj'],template:`

{{myObj.name}}:{{myObj.age}}岁

按钮
`,数据(){return{myObj:this.initialObj}},methods:{fn(){this.initialObj.name="Jack"//对象修改会影响父类1处的值}}})子组件传值给父组件子组件给父组件传值需要使用自定义事件实现,不能通过props进行处理。通过自定义事件,parent传递给child,操作后child想传回给parent就会出现问题。子组件什么时候处理,什么时候修改数据,什么时候把数据传递给父组件都无法确定。因此,通过事件触发案例,商品为子组件,购物车为父组件。父组件需要统计商品数量,所以需要在子组件数量变化时,给父组件传递一个值。varvm=newVue({data:{products:[{id:1,title:"eggplant"},{id:2,title:"pepper"},{id:3,title:"tomato"}],totalCount:0},}).$mount("#app")

购物车

总数为{{totalCount}}

Vue.component('product-item',{props:['title'],template:`
名称{{title}},数量{{count}}+1
`,data(){return{count:0}},methods:{countIns(){this.count++;}}})当子组件数据发生变化时,通过$emit()触发自定义事件。(实例方法)自定义事件名称建议使用kebab-case,父组件中使用@绑定驼峰或Pascal,无法识别Vue.component('product-item',{...methods:{countIns(){this.$emit('count-change')//触发,监听父组件中的this.count++;}}})父组件

总数为{{totalCount}}

自定义事件值Vue.component('product-item',{...methods:{countIns(){this.$emit('count-change',1)//传递参数this.count++;},countIns5(){this.$emit('count-change',5)this.count+=5;}}})父组件在监听事件时需要接收子组件传过来的数据。

总数为{{totalCount}}

or@count-change="onCountChange"newVue({...methods:{onCountChange(productCount){//在方法中接收参数this.totalCount+=productCount}}})非父子组件传值非父子组件是指兄弟组件或者两个完全不相关的组件内容概述兄弟组件传值EventBus其他传值方式兄弟组件传值兄弟组件可以通过父组件,比如a和b子组件要传值,可以通过a子组件传给父组件,再从父组件传给b子组件newVue({data:{value:""//数据传输的根实例数据}})//childa将数据传递给parent//父组件向子组件b传输数据A组件Vue.components('ComA',{template:`组件A内容{{value}}Send`,data(){return{value:'Strengthcontent'}}})BcomponentVue.components('ComB',{props:['value']template:`componentBContent{{value}}`})EventBus问题当组件嵌套关系复杂时,按照组件关系传值会很麻烦。对于组件的数据传递,data中会有很多与当前组件功能无关的数据。解决方案EventBus(事件总线)是一个独立的事件中心,用于管理不同组件之间的值传递操作。(Postman,中转处理)EventBus通过一个新的Vue实例来管理组件传值操作,组件通过为实例注册事件和调用事件来实现数据传递。//EventBus.jsvarbus=newVue()//无需配置,仅通过事件发送数据的组件触发总线事件,接收组件向总线注册相应的事件。//importjsVue.component('product-item',{...methods:{countIns(){bus.$emit('count-change',1)//使用总线实例替换组件product-item实例this.count++;}}})通过$on()操作向总线注册相应的事件。Vue.component('product-total',{template:`

{{totalCount}}

`,data(){return{totalCount:0}},created(){//实例之后createdTriggercountIns(){bus.$on('countChange',(productCount)=>{this.totalCount+=productCount//注意这里,箭头函数})}}})