【问题标题】:Post to list from Vue component从 Vue 组件发布到列表
【发布时间】:2018-03-14 13:11:51
【问题描述】:

如何通过 subInput(in component, 2nd input) 发布到组件外的列表中?我可以看到输入发布到 subTaskList,但不会发布到列表?

澄清:我正在尝试制作一个食物计划器,其中 placeholder="Tilføj ret til madplanen" 的主要输入是当天的食物,而 placeholder="Tilføj til indkøbsseddel" 的第二个输入是添加到购物清单 (#list)

(对不起丹麦占位符)

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

                '<section class="prefetch" class="panel">' +
                '<input  v-if="showInput" class="input typeahead" type="text" placeholder="Tilføj ret til madplanen" 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="removeSubTask(task)">X</button>' + '</summary>' +
                '<input class="subInput" type="text" placeholder="Tilføj til indkøbsseddel" 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 = "";
                    }
                },

                //removeTasks
                //
                removeSubTask: function(task) {
                    var index = this.taskList.indexOf(task);
                    this.taskList.splice(index, 1);
                    var index = this.subTaskList.indexOf(task);
                    this.subTaskList.splice(index, 999);
                },
            },
        });


        new Vue({
            el: "#madplan",
            data: {
                newTask: "",
                taskList: [],
                newSubTask: "",
                subTaskList: [],
            },
        });
        
* {
  margin: 0;
  padding: 0;
}
<script src="https://unpkg.com/vue/dist/vue.js"></script>
  <section id="madplan" class="section-wrapper">

        <section class="check-list">
            <h1>Mandag</h1>
            <list-component></list-component>
            <h1>Tirsdag</h1>
            <list-component></list-component>

        </section>
        <ul id="list">
            <h2>list</h2>
            <li v-for="task in subTaskList" v-bind:key="task.text" class="list-item">{{ task.text }}</li>
        </ul>

    </section>

小提琴:https://jsfiddle.net/txh85nq0/1/

【问题讨论】:

    标签: vue.js vue-component


    【解决方案1】:

    要完成 Vue.js 组件之间的通信,您需要利用 Custom events

    要使您的组件按预期工作,您需要进行一些修改。

    先更正这一行

    <section class="prefetch" class="panel">
    

    删除重复的类定义。你应该使用

    <section class="prefetch panel">
    

    然后在 addTask 方法的 list-component 声明中添加该行

    this.$emit('addedtask', task); 
    

    紧接着

    this.newTask = "";
    

    一边做,一边加上这个

    this.$emit('removedtask', task);
    

    就在该行之后

    this.subTaskList.splice(index, 999);
    

    在同一个list-component声明的removeSubTask方法中 现在通过更改捕获子组件更新#madplan模板中发出的事件

    <list-component></list-component>
    

    到这里

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

    您还需要声明两个新方法,以便 #madplan 现在包含

    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)
        }
     }
    

    见updated fiddle

    【讨论】:

    • 您好,感谢您的回复。这不完全是我所考虑的结果,但我理解其中的困惑 - 并感谢您的支持!新的小提琴将 .panel 部分中输入字段的输入添加到列表中,但是需要将第二个输入(具有 subInput 类的输入)添加到列表中。
    • 没关系,似乎自己通过将“this.$emit('addtask', task)”添加到 addSubTask 来解决这个问题!
    • 我还有一个简单的问题。我添加了行“this.subTaskList.splice(index, 999);”到 removeSubTask 函数,因为我希望它从列表中删除由该输入字段添加的项目。这不起作用,至少不是所有的时间。当它删除时,它只会删除一个,而不是全部。
    • 要从数组中删除元素,过滤数组以查找要删除的元素会将其从返回的列表中排除。尝试将removeSubTask: function(task) { var index = this.taskList.indexOf(task); this.taskList.splice(index, 1); var index = this.subTaskList.indexOf(task); this.subTaskList.splice(index, 999); }, 更改为removeSubTask: function(task) { this.$data.subTaskList = this.$data.subTaskList.filter(it =&gt; it.text != task.text) }
    • 我有很多东西要学。再次,非常感谢您的支持。这对我帮助很大!我还是 js 方面的菜鸟 :)
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 2017-11-15
    • 1970-01-01
    • 2020-01-30
    • 2020-03-19
    • 2020-05-28
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多