2017-03-15 69 views
2

我有一個基本的任務列表組件和一個任務項目組件。Vue.js動態組件和列表

<template> 
     <task v-for="(task, index) in tasks" :is="task" >{{ task.name }}</task> 
</template> 

我有一個像這樣的任務編輯按鈕:

<template> 
    <slot></slot> 
    <button v-on:click="$emit('edit')">Edit</button>  
</template> 

是否有一個簡單的方法來具體任務成分的改變任務編輯單擊編輯時?

這個頁面的HTML就是:

<task-list></task-list> 

更新:Here is my fiddle

+0

如果要動態更改渲染的組件,您可以使用動態組件。 https://vuejs.org/v2/guide/components.html#Dynamic-Components – Bert

+0

是的,因此''':是'''。主要問題是,動態組件是否需要影響整個列表,或者我可以只選擇一個組件用於一個列表項目? –

+0

Gotcha。有一個工作小提琴/ codepen? – Bert

回答

2

添加一個模式,表示您要使用的組件並設置: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。注意:不實際保存編輯。

+0

不錯,給我幾個處理,然後我接受。 –