在VueJs 2.0文档中,我找不到任何可以监听道具变化的钩子。
VueJs有这样的钩子像onpropsupdate()或类似的吗?
更新
正如@wostex建议的那样,我试着观察我的财产,但没有任何变化。然后我意识到我遇到了一个特殊的情况:
<template>
<child :my-prop="myProp"></child>
</template>
<script>
export default {
props: ['myProp']
}
</script>
我将父组件接收到的myProp传递给子组件。然后手表:{myProp:…不起作用。
在我的情况下,我需要一个解决方案,任何时候任何道具都会改变,我需要再次解析我的数据。我厌倦了为我所有的道具制作分离的观察者,所以我用了这个:
watch: {
$props: {
handler() {
this.parseData();
},
deep: true,
immediate: true,
},
},
从这个例子中得到的关键点是使用deep: true,这样它不仅监视$props,而且还监视它的嵌套值,例如props. myprop
你可以在这里了解更多关于这款扩展手表的选择:https://v2.vuejs.org/v2/api/#vm-watch
道具和v型模型处理。如何将值从父对象传递给子对象,再从子对象传递给父对象。
不需要手表!另外,在Vue中改变道具也是一种反模式,所以永远不要改变子组件或组件中的道具值。使用$emit更改值,Vue将始终按预期工作。
/* COMPONENT - CHILD */
Vue.component('props-change-component', {
props: ['value', 'atext', 'anumber'],
mounted() {
var _this = this
this.$emit("update:anumber", 6)
setTimeout(function () {
// Update the parent binded variable to 'atext'
_this.$emit("update:atext", "4s delay update from child!!")
}, 4000)
setTimeout(function () {
// Update the parent binded v-model value
_this.$emit("input", "6s delay update v-model value from child!!")
}, 6000)
},
template: '<div> \
v-model value: {{ value }} <br> \
atext: {{ atext }} <br> \
anumber: {{ anumber }} <br> \
</div>'
})
/* MAIN - PARENT */
const app = new Vue({
el: '#app',
data() {
return {
myvalue: 7,
mynumber: 99,
mytext: "My own text",
}
},
mounted() {
var _this = this
// Update our variable directly
setTimeout(function () {
_this.mytext = "2s delay update mytext from parent!!"
}, 2000)
},
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<props-change-component
v-model='myvalue'
:atext.sync='mytext'
:anumber.sync='mynumber'>
</props-change-component>
</div>
不确定你是否已经解决了这个问题(如果我理解正确的话),但这是我的想法:
如果父节点接收myProp,并且你希望它传递给子节点并在子节点中观看它,那么父节点必须有myProp的副本(不是引用)。
试试这个:
new Vue({
el: '#app',
data: {
text: 'Hello'
},
components: {
'parent': {
props: ['myProp'],
computed: {
myInnerProp() { return myProp.clone(); } //eg. myProp.slice() for array
}
},
'child': {
props: ['myProp'],
watch: {
myProp(val, oldval) { now val will differ from oldval }
}
}
}
}
在html中:
<child :my-prop="myInnerProp"></child>
实际上,在这种情况下处理复杂的集合时,你必须非常小心(传递几次)
我认为在大多数情况下,Vue会在道具变化时更新组件的DOM。
如果这是你的情况,那么你可以使用beforeUpdate()或updated()钩子(docs)来观察道具。
如果你只对新val感兴趣而不需要旧val,你可以这样做
new Vue({
el: '#app',
data: {
text: ''
},
components: {
'child': {
template: `<p>{{ myprop }}</p>`,
props: ['myprop'],
beforeUpdate() {
console.log(this.myprop)
},
updated() {
console.log(this.myprop)
}
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<child :myprop="text"></child>
<input v-model="text" placeholder="Type here to view prop changes" style="width:20em">
</div>