使用するコンポーネントを表すモードを追加し、:is="task.mode"
を設定します。
<div id="app">
<list></list>
</div>
<template id="list-template">
<div>
<component v-for='task in tasks'
:is='task.mode'
:task='task'
@edit="edit"
@save="save">
</component>
</div>
</template>
<template id="task-template">
<div>
<h1>{{task.text}}</h1>
<button @click="$emit('edit', task)">Edit</button>
</div>
</template>
<template id="task-edit-template">
<div>
<input type="text" :value="task.text">
<button @click="$emit('save', task)">Save</button>
</div>
</template>
コード
Vue.component("list",{
template:"#list-template",
data(){
return {
tasks:[{text: "task1", mode:"task"}, {text: "task1", mode:"task"}]
}
},
methods:{
edit(task){
task.mode = "task-edit"
},
save(task){
task.mode = "task"
}
}
})
Vue.component("task", {
props:["task"],
template:"#task-template",
})
Vue.component("task-edit",{
props:["task"],
template:"#task-edit-template"
})
new Vue({
el:"#app"
})
Working example。注:実際には編集内容を保存しません。
レンダリングされたコンポーネントを動的に変更する場合は、動的コンポーネントを使用できます。 https://vuejs.org/v2/guide/components.html#Dynamic-Components – Bert
はい、 '' ':is'''です。主な質問は、ダイナミックコンポーネントがリスト全体に影響を与える必要があるのか、または1つのリスト項目に対してのみコンポーネントを選択できるかということです。 –
Gotcha。働くフィドル/コードペンを持っていますか? – Bert