【发布时间】:2021-02-22 19:16:15
【问题描述】:
我在 vue 3 中使用组合 API 对反应性组件进行双向绑定时遇到问题。
设置:
父调用代码为:
<template>
<h1>{{ message.test }}</h1>
<Message v-model="message" />
</template>
<script>
import Message from '@/components/Message.vue';
import { reactive } from 'vue';
export default {
name: 'Home',
components: { Message },
setup() {
const message = reactive({ test: '123' });
return {
message
};
}
};
</script>
子组件代码为:
<template>
<label>
<input v-model="message" type="text" />
</label>
</template>
<script>
import { computed } from 'vue';
export default {
props: {
messageObj: {
type: Object,
default: () => {},
},
},
emits: ['update:messageObj'],
setup(props, { emit }) {
const message = computed({
get: () => props.messageObj.test,
set: (value) => emit('update:messageObj', value),
});
return {
message,
};
},
};
</script>
问题:
加载组件时,对象的默认值会显示在输入字段中。 这是应该的,但是,当我更新输入框中的值时,父视图中的 H1 不会更新为新的输入框值。
我已经搜索了 stackoverflow 板和谷歌,但没有找到任何关于需要做什么来使对象反应的提示。
我阅读了reactivity documentation,但仍然没有找到任何解决我的问题的方法。
为了测试,我已将 message 更改为 ref 并使用这个单一的 ref 值,数据保持反应性,一切都按预期工作。
关于反应性对象不更新可能是什么问题的任何指针?
【问题讨论】:
-
目前还不清楚您传递给孩子的内容。
v-model:test="message"在其余代码的上下文中没有意义。您是将整个reactive还是仅将一个变量 (test) 传递给孩子? -
嗨,Daniel, v-model:test="message" 确实不对,它仍然是我忘记在另一次测试后改回的代码。它应该是
js <template> <h1>{{ message.test }}</h1> <Message v-model="message" /> </template>
标签: vue.js vue-component vuejs3