使用 vue 与待办事项列表一起玩。
在这个阶段,我可以用编辑按钮显示列表,文本将是一个输入,所以我可以编辑待办事项。但是例如,如果我有 10 个项目,并且我单击了项目 2、项目 4 和项目 5 的编辑,那么所有这 3 个项目都将变为输入。
我在想的是,如果我单击第 4 项,则第 2 项将变回文本,因此如果单击编辑,则只有一项将显示输入。
我的模板代码如下
<td class="col-8">
<!-- if editable is false, show the checkbox and todo item -->
<div class="custom-control custom-checkbox" v-if="!editable">
{{ todo.item }}
</div>
<!-- if editable is true, turn item into an input so user can enter new value -->
<div v-else>
<input ref="editItem" type="text" class="form-control" :value="todo.item" @input="onInput">
</div>
</td>
<td class="col-2">
<button
class="btn btn-sm"
:class="editable ? 'btn-outline-success' : 'btn-outline-info'"
@click.prevent="editable ? onSave() : onEdit()">{{ editable ? 'save' : 'edit' }}
</button>
</td>
当我在 chrome 中打开 vue 检查时,我可以看到所有项目都有不同的数据值。我怎样才能改变其他兄弟姐妹的价值?
在此先感谢您的任何建议和建议。
我不建议您更改另一个兄弟姐妹的值,因为您无法确定它可能导致的副作用,显然当您查看待办事项列表时,会感觉没有副作用,但总的来说实践中,一个节点应该改变父系中位于它之下的元素,既不高于也不在兄弟姐妹。
如果你想改变上面的元素,它总是通过事件驱动。你让父母知道有些事情需要改变,而不是自己改变。
这是您可以在此处执行的操作:
editable
作为数据属性,把它作为一个支柱到TodoListItem组件。 props: {
editable: {
type: Boolean,
default: false
},
}
/** You should keep a deepCopy of the props if you are changing the state
of that object and then send the updated local data prop to the parent
as well for updation rather than changing the prop object.
NEVER CHANGE THE PROP OBJECT DIRECTLY. -> this.todoItem =
this.deepCopy(this.todo);
Do this in before mount hook of the child component.
**/
this.$emit('todo-item-action', action, todoItem);
TodoList
组件中,捕获此事件并更改项目的状态,如下所示: <todo-list-item
v-for="todo in todos"
:key="todo['id']"
:todo="todo"
:editable="todo['editable']"
@todo-item-action="handleItemAction"
>
或者如果你不想改变 todo 对象。在这里,您可以确保 editableItem 是null
在未选择任何内容或仅引用活动项目 ID 的情况下,以便道具将更改并且其他列表项目将自动变为不可编辑。
<todo-list-item
v-for="todo in todos"
:key="todo['id']"
:todo="todo"
:editable="editableItem === todo['id']"
@todo-item-action="handleItemAction"
>
您通过事件和道具驱动组件的次数越多,它的可重用性就越高。始终有一个协调器组件,它stateless
通过处理由它们传播的事件并通过 props 发送状态来操纵这些组件。
这是我一直遵循的方法,它总是让我能够干净、快速地重构。
问候。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句