带有CSS样式的Vue v-model?

时间:2017-10-03 17:13:53

标签: vue.js vue-component styling

很难解释这个问题,所以我想我将首先展示我所拥有的:

        Vue.component('list-component', {
            data: function() {
                return {
                    newTask: "",
                    taskList: [],
                    newSubTask: "",
                    subTaskList: [],
                };
            },
            template:
                '<div>' +

                '<section class="prefetch">' +
                '<input  v-if="showInput" class="input typeahead" type="text" placeholder="mainInput" v-model="newTask" v-on:keyup.enter="addTask">' +
                '</section>' +

                '<details v-for="task in taskList" v-bind:key="task.text" class="sub-list-item">' +
                '<summary>{{ task.text }}<button v-on:click="removeTask(task)">X</button>' + '</summary>' +
                '<input class="subInput" type="text" placeholder="subInput" v-model="newSubTask" v-on:keyup.enter="addSubTask">' +
                '</details>' +

                '</div>',

            computed: {
                showInput: function() {
                    return !this.taskList.length
                },
            },

            methods: {
                //addTasks
                //
                addTask: function() {
                    var task = this.newTask.trim();
                    if (task) {
                        this.taskList.push({
                            text: task
                        });
                        this.newTask = "";
                    }
                },

                addSubTask: function() {
                    var task = this.newSubTask.trim();
                    if (task) {
                        this.subTaskList.push({
                            text: task
                        });
                        this.newSubTask = "";
                        this.$emit('addedtask', task);

                    }
                },

                //removeTasks
                //
                removeTask: function(task) {
                    var index = this.taskList.indexOf(task);
                    this.taskList.splice(index, 1);
                    this.$emit('removedtask', task);
                },
            },
        });


        new Vue({
            el: "#madplan",
            data: {
                newTask: "",
                taskList: [],
                newSubTask: "",
                subTaskList: [],
            },
            methods: {
              acknowledgeAddedTask: function(task) {
                this.$data.subTaskList.push({ text: task })
              },
              acknowledgeRemovedTask: function(task) {
                this.$data.subTaskList = this.$data.subTaskList.filter(it => it.text != task.text)
              },
              removeSubTask: function(task) {
                  var index = this.subTaskList.indexOf(task);
                  this.subTaskList.splice(index, 1);
                  this.$emit('removedtask', task);
              },
            }
        });
.first {
  background-color: red;
}

.second {
  background-color: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
    <section id="madplan" class="section-wrapper">

        <section class="check-list">

            <list-component
              class='first'
              v-on:addedtask='acknowledgeAddedTask'
              v-on:removedtask='acknowledgeRemovedTask'
            ></list-component>

            <list-component
              class='second'   
              v-on:addedtask='acknowledgeAddedTask'
              v-on:removedtask='acknowledgeRemovedTask'
            ></list-component>
            
                    </section>
        <ul id="indkøbseddel">
            <h2>Indkøbsseddel</h2>
            <li v-for="task in subTaskList" v-bind:key="task.text" class="list-item">{{ task.text }}<button v-on:click="removeSubTask(task)">X</button></li>
        </ul>

    </section>

因此,如果您尝试运行应用程序,并使用类.first将一些文本添加到mainInput字段 - 这个新的详细信息将获得类.first。但是当你打开细节并在新字段(subInput)中输入时,它会将此输入发布到ul id =“indkøbseddel”中的li - 但现在类/样式已经消失了。

我可以以某种方式将此转移给李? 我想要完成的是li上的不同颜色,从第一个输入(列表组件)或第二个输入添加它。

很难解释,所以随时提问。它不必以这种方式完成,我只需要能够根据哪个输入字段区分添加的li。

提前致谢!

JSFiddle:https://jsfiddle.net/ucL2pv6f/

2 个答案:

答案 0 :(得分:1)

我认为您要做的是绑定每个子任务li,使其具有.first或.second类,基于创建它的父任务。查看Vue文档中的class and style binding section

答案 1 :(得分:1)

一旦您意识到表达式component等同于parent

,将v-on:addedtask='acknowledgeAddedTask'的类传递到其v-on:addedtask='task => acknowledgeAddedTask(task)'的难度就会变得更容易接近

然后,您可以在此基础上更改组件声明,使class='first' v-on:addedtask='acknowledgeAddedTask变为class='first' v-on:addedtask='task => acknowledgeAddedTask("first", task)',并且对第二个组件更明智。

然后您需要更改为acknowledgeAddedTask方法以适应新参数,以便最终得到

acknowledgeAddedTask: function(cls, task) { 
  this.$data.subTaskList.push({ 
    text: task, 
    class: "list-item " + cls 
  })
}

最后,在li的{​​{1}}上将类属性更改为#madplan,以便每个列表项在添加该项时都具有正确的类。

请参阅updated fiddle