mar*_*lin 2 javascript vue.js vue-component vuejs3 vue-composition-api
考虑这个说明性示例:
const App = {
setup() {
const name = Vue.ref("");
let firstTime = true;
const message = Vue.computed(() => {
if (firstTime) {
firstTime = false;
return "Welcome stranger";
}
return `Hello ${name.value}`;
});
return {
name,
message
}
}
};
Vue.createApp(App).mount("#root");
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
name: <input v-model="name"/> <br/>
message: {{ message }}
</div>
Run Code Online (Sandbox Code Playgroud)
如您所见,message
存储一个计算值,该值应该跟踪更新,name
但它不是。
为什么会这样以及如何解决?
Computed 应始终使用您想要计算的不可变的反应式 ref 对象。
因此,如果您在开始时声明正在使用的反应性对象,它将起作用。
const App = {
setup() {
const name = Vue.ref("");
let firstTime = true;
const message = Vue.computed(() => {
name.value;
if (firstTime) {
firstTime = false;
return "Welcome stranger";
}
return `Hello ${name.value}`;
});
return {
name,
message
}
}
};
Vue.createApp(App).mount("#root");
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
name: <input v-model="name"/> <br/>
message: {{ message }}
</div>
Run Code Online (Sandbox Code Playgroud)
这是因为如果你这样写,Vue无法message
发现你的计算属性和 ref之间的依赖关系。name
问题是firstTime
变量。
发生的事情是,Vue通过运行计算属性并观察在此过程中访问了哪些响应式引用,在运行时(而不是编译时)发现依赖关系:
name.value
您的计算属性第一次运行时不会被访问。而且因为在第一次运行期间根本没有访问响应式引用,所以您的计算属性将永远不会再次被触发。如果您不是第一次访问 name.value 也没关系,但您需要访问其他响应性的东西,并且当firstTime变为 false 时会发生变化:
const App = {
setup() {
const name = Vue.ref("");
const firstTime = Vue.ref(true);
Vue.watch(()=> name.value, ()=>{firstTime.value=false;});
const message = Vue.computed(() => {
if (firstTime.value) {
return "Welcome stranger";
}
return `Hello ${name.value}`;
});
return {
name,
message
}
}
};
Vue.createApp(App).mount("#root");
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
name: <input v-model="name"/> <br/>
message: {{ message }}
</div>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1654 次 |
最近记录: |