VueJS 观察插入的参数
VueJS observe plugged parameter
我从 VueJS 2 开始,我创建了一个简单的插件,它将参数添加到 Vue 实例。
我有问题,因为当我更新这个值时,我的计算属性仍然相同。
我的示例插件代码:
export default function (Vue) {
Vue.MyProperty = "test"
Object.defineProperties(Vue.prototype, {
"$myProperty": {
"get": function () {
return Vue.MyProperty
},
"set": function (value) {
Vue.MyProperty = value
return this
}
}
})
}
以及我的组件代码
export default {
"computed": {
"test": function () {
return this.$myProperty
}
}
}
当我在其他组件中更改 this.$myProperty
时,我的组件 returns 有效值(例如,当我从 "test"
更改为 "newvalue"
我可以看到 "newvalue"
) 但计算出的 属性 test
仍然是旧值(在我的示例中为 "test"
)。
我尝试使用 this.$set(this, "$myProperty", value)
但这仍然无效。
如何使用或声明此 属性 以在计算或监视属性中使用它?
数据值在计算中没有自动更新的原因是因为你添加到 Vue 的 属性,MyProperty
不是 observed 属性。从根本上说,Vue 的反应性是有效的,因为添加到 data 的所有值都被转换为 observed 属性;在引擎盖下,它们被转换成 getter/setter 对和一些额外的代码,以便当这些属性之一 更改 时,Vue 知道将更改传播到所有依赖它的东西值。
然而,问题中的代码只是向 Vue 对象添加了一个普通的 属性。您可以更改它,但它不是被动的。
也就是说,让它成为反应式相对容易。我在我的回答 的评论中介绍了如何做到这一点。基本上,不是将 属性 添加到 Vue,而是创建一个新的 Vue 对象(开销非常低)并使 属性 您想要响应的 属性 该 Vue。这是一个工作示例。
console.clear()
function MyPlugin(Vue) {
let store = new Vue({data:{MyProperty: "some value"}})
Object.defineProperties(Vue.prototype, {
"$myProperty": {
"get": function () {
return store.MyProperty
},
"set": function (value) {
store.MyProperty = value
return this
}
}
})
}
Vue.use(MyPlugin)
const MyComponent = {
template:`<div>{{test}}</div>`,
"computed": {
"test": function () {
return this.$myProperty
}
}
}
new Vue({
el: "#app",
components:{
MyComponent
}
})
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="app">
<my-component></my-component>
<button @click="$myProperty = 'new value'">Change</button>
</div>
我从 VueJS 2 开始,我创建了一个简单的插件,它将参数添加到 Vue 实例。
我有问题,因为当我更新这个值时,我的计算属性仍然相同。
我的示例插件代码:
export default function (Vue) {
Vue.MyProperty = "test"
Object.defineProperties(Vue.prototype, {
"$myProperty": {
"get": function () {
return Vue.MyProperty
},
"set": function (value) {
Vue.MyProperty = value
return this
}
}
})
}
以及我的组件代码
export default {
"computed": {
"test": function () {
return this.$myProperty
}
}
}
当我在其他组件中更改 this.$myProperty
时,我的组件 returns 有效值(例如,当我从 "test"
更改为 "newvalue"
我可以看到 "newvalue"
) 但计算出的 属性 test
仍然是旧值(在我的示例中为 "test"
)。
我尝试使用 this.$set(this, "$myProperty", value)
但这仍然无效。
如何使用或声明此 属性 以在计算或监视属性中使用它?
数据值在计算中没有自动更新的原因是因为你添加到 Vue 的 属性,MyProperty
不是 observed 属性。从根本上说,Vue 的反应性是有效的,因为添加到 data 的所有值都被转换为 observed 属性;在引擎盖下,它们被转换成 getter/setter 对和一些额外的代码,以便当这些属性之一 更改 时,Vue 知道将更改传播到所有依赖它的东西值。
然而,问题中的代码只是向 Vue 对象添加了一个普通的 属性。您可以更改它,但它不是被动的。
也就是说,让它成为反应式相对容易。我在我的回答
console.clear()
function MyPlugin(Vue) {
let store = new Vue({data:{MyProperty: "some value"}})
Object.defineProperties(Vue.prototype, {
"$myProperty": {
"get": function () {
return store.MyProperty
},
"set": function (value) {
store.MyProperty = value
return this
}
}
})
}
Vue.use(MyPlugin)
const MyComponent = {
template:`<div>{{test}}</div>`,
"computed": {
"test": function () {
return this.$myProperty
}
}
}
new Vue({
el: "#app",
components:{
MyComponent
}
})
<script src="https://unpkg.com/vue@2.4.2"></script>
<div id="app">
<my-component></my-component>
<button @click="$myProperty = 'new value'">Change</button>
</div>