【发布时间】:2020-05-16 06:02:08
【问题描述】:
我有以下包含这两个组件的待办事项应用程序:App 和 Todo
App.vue
<template>
<div class="todo-list">
<div :key="index" v-for="(todo, index) in state.todos">
<Todo :todo="todo" :state="state" />
</div>
</div>
</template>
<script>
import { reactive } from '@vue/composition-api';
import Todo from './components/Todo.vue';
export default {
components: {
Todo
},
setup() {
let state = reactive({
todos: [
{ text: 'Learn about Vue', isCompleted: false },
{ text: 'Meet friend for lunch', isCompleted: false },
{ text: 'Build really cool todo app', isCompleted: false }
]
});
return { state };
}
};
</script>
Todo.vue
<template>
<div class="todo">{{ todo.text }}<button @click="deleteTodo">x</button></div>
</template>
<script>
export default {
props: ['todo', 'state'],
setup({ todo, state }) {
const deleteTodo = () => {
state.todos = state.todos.filter(t => t != todo);
};
return {
deleteTodo
};
}
};
</script>
deleteTodo 函数在 Todo.vue 组件中工作正常,但是,我想知道是否可以不传递 state 对象而是使用 ref() 之类的所以并通过todos...
所以在 App.vue
//...
let todos = ref({[
{ text: 'Learn about Vue', isCompleted: false },
{ text: 'Meet friend for lunch', isCompleted: false },
{ text: 'Build really cool todo app', isCompleted: false }
]);
//...
代替:
//...
let state = reactive({
todos: [
{ text: 'Learn about Vue', isCompleted: false },
{ text: 'Meet friend for lunch', isCompleted: false },
{ text: 'Build really cool todo app', isCompleted: false }
]
});
//...
但是,当我尝试这样做时……孩子无法过滤已删除的待办事项并重新分配给todos 变量。这不起作用。
有什么想法可以让它与ref一起工作吗?
【问题讨论】:
-
直接修改 props 是一种反模式。你应该避免这样做。 vuejs.org/v2/guide/components-props.html#One-Way-Data-Flow
-
这有帮助。应该提供这个作为答案。我会接受的。虽然为了他人的利益而有更多细节。具体来说,我使用来自子级的发出事件来处理父级中的状态变化。现在我可以在父母中使用
ref()。