设计vue的父子组件的时候,使用了provide/inject来传值,但是在使用el-input-number组件控制参数的时候,子组件调用父组件的函数只相应了一次,怎么解决?
父组件:
provide() {
return {
host: () => this
}
},
methods: {
onUpdateProps(node) {
console.log(node,"node")
this.canvas.setValue(node)
},
}
子组件 :
<el-input-number v-model="props.node.fontSize" :size="inputSize" :min="12" :max="100" :step="1" default-value="12" style="width:100%;" @change="host().onUpdateProps(props.node)" />
inject: ['host'],
第一次点击加或者减可以生效,之后点击就无法生效了
为什么不使用事件传值呢,采用事件方式传值,简单,还好理解,下面是一个详细并简单的例子,有帮助请点击右上角采纳,有疑问可以下发评论哦
https://www.csdn.net/tags/MtTaAg0sNjc3NTQtYmxvZwO0O0OO0O0O.html#1props__emit_22
如果只是父子组件传递事件的话,还是用$emit比较好吧。如果是想在子组件里更新父组件里变量的值,也可以用.sync修饰符。然后通过emit update来更新值。
简单的例子:
·父组件如下(父组件中可以监听title变量的值,然后去执行 this.canvas.setValue(node))
<text-document :node.sync="title"></text-document>
·子组件,change绑定事件
changeMethod(val){
this.$emit('update:node',val)
}
vue 文档有提到一点: provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的。
如果你要实时响应this, 那么父组件的data中新建一个对象属性, 并把这个对象属性注入provide中.
举个例子如下:
data(){
return{
...,
fatherInstance: { instance: this }
}
},
provide(){
return{
host :this.fatherInstance // 此处provide一个对象
}
},
原因是data是响应式数据, 因为host是对象, 对象是引用类型, 所以得以监听
统一回复一下,我找到问题了,不是inject的问题,是input-number的model问题,我传入model的层级太多导致input-number加减失效了