import Vue from 'vue'const ChildComponent = { inject:['yeye','value'] //重点,结合provide,上下多级传递值 template:`childComponent`, mounted:{ console.log(this.yeye,this.value) }}const component = { name:'component', compoennts:{ ChildComponent }, template:``, data(){ return { style:{ width:'200px', height:'200px', border:'1px solid #aaa' } } }, model:{ prop:'value1', // event:'change' // }, props: ['value1'], methods:{ handleInput(e){ this.$emit('change',e.target.value) } }}new Vue({ el:'#root', provide(){ //跨层*级*组件通讯,注:Vue默认不是react的 const data={} Object.defineProperty(data,'value',{ //***重点** get:()=>this.value, //变为响应式 enumerable:true //变为响应式 }), return { //通过return方法传值 yeye:this, //非响应式 data //变为响应式 } }, components:{ CompOne:component }, propsData:'xxx ', //用传入prop失败 data:{ return { value:"123" } }, mounted(){ console.log('this.refs.comp') console.log('this.refs.span') }, template:`//具名插槽 //作用域插槽 `,})复制代码this is content //具名插槽 { {props.value}}{ {props.aaa}} //注意这儿拿到的是456999
重点:
- 作用域插槽,传值slot-scope="props" { {props.value}}
- 通常可以$parent可以拿到上级组件,跨层级传值通过provider
- 父级(跨级)提供provider,子集inject引用。提供的参数不是响应式的,要做处理。
注意:
官网说这种方法尽量不用,可能有坑,后续更新处理方案