如何从Vue中的所有子复选框组成部分收集选定的复选框? [英] How can I collect selected checkboxes from all child checkbox components in vue?

查看:69
本文介绍了如何从Vue中的所有子复选框组成部分收集选定的复选框?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一张表,其中行元素都由子组件填充。这些子组件中的每个都有一个复选框。现在,我想一次获得所有选中的复选框。我可以使用prefs发射作为两种方式绑定并更新父对象上的数组或对象,但是我想知道是否有更好的方法。

I have a table where the row elements are all populated by child components. There is a checkbox in each of these child components. Now I want to get all checked checkboxes at once. I could use prefs emit as two way binding and update an array or object on the parent but I am wondering if there is better way for this.

下面是一个简短的示例模板部分:

Here a short example for the template part:

<table>
    <thead>
        <tr>
            <th> Check </th>
            <th> Title </th>
        </tr>
    </thead>
    <list-tbody v-for="element in elements" :element="element"> </list-tbody>
</table>

这是子元素

<tbody>
    <tr>
        <td>
            <input type="checkbox">
        </td>
        <td> {{element.title}} </td>
    </tr>
</tbody>


推荐答案

如评论中所述,您可以一分为二方式:

As mentioned in the comments you could handle this in two ways:


  • 使用Vuex并从子组件中更改元素数组。

  • 发送事件

您首选第二个,因为您没有使用Vuex没关系。

You prefer the second because you're not using Vuex and that's OK.

一旦您将数据链接到子组件和父组件之间,就可以使用过滤器方法仅显示选定的元素。

Once you're having the data "linked" between child component and parent you can use a filter method to only show the selected elements.

请查看下面的演示或我的评论中的小提琴。

Please have a look at the demo below or the fiddle from my comment.

const listTbodyVuex = {
props: ['element'],
	template: `
  	<tbody>
    <tr>
        <td>
            <input type="checkbox" @click="selected">
        </td>
        <td> {{element.title}} </td>
    </tr>
</tbody>
  `,
  methods: {
  	...Vuex.mapMutations(['changeSelection']),
  	selected(evt) {
    	//console.log('clicked', evt.target.checked, this.changeSelection)
      // changeSelection mutation could be also called with-out mapping
      // this.$store.commit('changeSelection', ...);
      this.changeSelection({
      	id: this.element.id, selected: evt.target.checked
      });
    }
  }
}

const listTbodyEvents = {
	props: ['element'],
	template: `
  	<tbody>
    <tr>
        <td>
            <input type="checkbox" @click="selected">
        </td>
        <td> {{element.title}} </td>
    </tr>
</tbody>
  `,
  methods: {
  	selected(evt) {
    	console.log('clicked', evt.target.checked)
      this.$emit('selected', {
      	element: this.element,
        newSelection: evt.target.checked
      })
    }
  }
}

const store = new Vuex.Store({
	state: {
  	elements: [
      {
      	id: 0,
      	title: 'first',
        selected: false
      },
      {	
      	id: 1,
      	title: 'second',
        selected: false
      },
      {
      	id: 2,
      	title: 'third',
        selected: false
      }
      ]
  },
  mutations: {
  	changeSelection(state, {id, selected}) {
    	let element = state.elements
      	.filter((element) => element.id === id)[0];
      element.selected = selected;
      //console.log('update element', JSON.parse(JSON.stringify(element)));
      Vue.set(state.elements, element.id, element);
    }
  }
})

new Vue({
	el: '#app',
  store,
  data() {
  	return {
    	elements: [
      {
      	id: 0,
      	title: 'first',
        selected: false
      },
      {	
      	id: 1,
      	title: 'second',
        selected: false
      },
      {
      	id: 2,
      	title: 'third',
        selected: false
      }
      ]
    }
  },
  computed: {
  	...Vuex.mapState({
    	vuexElements: (state) => state.elements
    })
  },
  components: {
  	listTbodyEvents,
    listTbodyVuex
  },
  methods: {
  	updateElement(data) {
    	let element = this.elements
      	.filter((element) => element.id === data.element.id)[0];
      element.selected = data.newSelection;
      // console.log('update', element)
    },
    filterSelected(data) {
    	// console.log('filter',  data.filter((item) => console.log(item.selected)))
    	return data.filter((item) => item.selected);
    }
  }
})

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuex/3.0.0/vuex.js"></script>
<div id="app">
<h1>Example with vuex</h1>
<table>
    <thead>
        <tr>
            <th> Check </th>
            <th> Title </th>
        </tr>
    </thead>
    <list-tbody-vuex v-for="element in elements" :element="element" :key="element.id"> </list-tbody-vuex>
</table>
  <pre>only selected: {{filterSelected(vuexElements)}}</pre>
  <pre>{{vuexElements}}</pre>
  
<hr/>
<h1>Example with events</h1>
<table>
    <thead>
        <tr>
            <th> Check </th>
            <th> Title </th>
        </tr>
    </thead>
    <list-tbody-events v-for="element in elements" :element="element" :key="element.id" @selected="updateElement"> </list-tbody-events>
</table>
  <pre>only selected: {{filterSelected(elements)}}</pre>
  <pre>{{elements}}</pre>
</div>

这篇关于如何从Vue中的所有子复选框组成部分收集选定的复选框?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆