vue onclick 对父组件中的子组件进行排序

Posted

技术标签:

【中文标题】vue onclick 对父组件中的子组件进行排序【英文标题】:Vue onclick sort child component in parent component 【发布时间】:2020-10-29 01:20:37 【问题描述】:

我正在使用 Vue cli,我有一组用户,我想在模板中显示为个人资料卡,我想按名称排序。 我正在使用 Vuex 来存储数据。

在我的模板中的子组件中:

<div class="outside"  v-for="(item, index) in arrays" :key="item.id" v-bind:id="item.name">
    <div class="stay">  <p class="n">  item.name </p> </div>

我正在获取 Vuex 数据:

computed: 
    arrays () 
      return this.$store.state.arrays
    ,

我的数组包含:

 arrays: [
       name: 'Peter',
       name: 'Beth',
       name: 'Daniel',
    ]

我在子组件中使用了一个函数:

computed:
   sortedArray: function() 
    function compare(a, b) 
      if (a.name < b.name)
        return -1;
      if (a.name > b.name)
        return 1;
      return 0;
    

    return this.arrays.sort(compare);
  
  ,

并将模板更改为:

<div class="outside"  v-for="(item, index) in sortedArrays" :key="item.id" v-bind:id="item.name">

但我想要一种方法来执行此操作(在父级中),而不是始终按顺序显示。

在我的父组件中:

<div class="begin">
<div class="b">Sort By:
                
 <select name="sort" class="sort" >
  <option value="name" @click="sortArrays()">Name</option>
 </select>
 </div>

<childComponent></childComponent>

</div>

我想要一个 sortArrays 函数,当我单击按名称排序时,我可以在父级中使用该函数以按字母顺序显示用户个人资料卡。

非常感谢!

【问题讨论】:

【参考方案1】:

您可以在 props 中将数组从父级发送到子级

使用道具

家长

.html

<div class="begin">
  <div class="b">Sort By:
            
     <select name="sort" class="sort" >
        <option value="name" @click="sortArray()">Name</option>
     </select>
  </div>

  <childComponent :arrays=arrays></childComponent>

</div>

.Vue

new Vue(
  data() 
    return 
      arrays: this.$store.state.arrays
    
  ,
  methods: 
    sortArray: function() 
       this.array.sort((a, b) => return a.name < b.name ? -1 : 1)
    
  
)

儿童

.Vue

new Vue(
   props: ['arrays']
)

使用排序标志

子组件将接受来自父组件的排序道具。当在父级上单击排序时,它将为真并发送给子级。在 Prop Change 时,child 将排序并显示排序后的数组。

儿童

.Vue

new Vue(
  props: ['isSorted],
  watch: 
    isSorted: function(oldval, newVal)
      if(newVal) 
        // Do the sorting
      
    
  
)

家长

.Vue

 new Vue( data() return  isSorted: false , methods:  sortArrays:  this.isSorted = true;  )

.html

  <child-component :isSorted=isSorted></child-component>

更新

change 事件可以绑定到选择。

<select name="sort" class="sort" @change="sortArray" v-model="filter">
    <option value="name">Name</option>
 </select>

在 Vue 中

props:  filter: '',
methods:  sortArray: function()  if(this.filter === 'name') // Do the sorting 

【讨论】:

谢谢!我尝试使用道具进行此操作,并且数据正在传递,但由于某种原因,@click 无法正常工作。我尝试做一个 console.log 但似乎没有显示 您是否定义了类似@click="sortArray" 的事件。没有sortArray() 我只是改成那个,但似乎仍然没有显示任何内容 你能把你的代码贴在codesandbox里让我明白真正的问题吗? 当然codesandbox.io/s/magical-curran-u0kr2?file=/package.json 但似乎我无法将事件绑定到选项***.com/questions/46260052/…【参考方案2】:

在您的数据中添加一个带有 bool 值的 showSorted:

data()
   return 
    showSorted: false
   
 

然后编辑您的计算结果以使用 showSorted:

computed:
   sortedArray: function() 
    function compare(a, b) 
      if (a.name < b.name)
        return -1;
      if (a.name > b.name)
        return 1;
      return 0;
    
    if(this.showSorted)
        return this.arrays.sort(compare);
     
     return this.arrays;
  
  ,

然后 onClick 你只需将this.showSorted 设置为true;

【讨论】:

谢谢!所以我应该添加布尔值并修改子组件中的计算?并在父项中添加 this.showSorted? 是的,我会在父级中使用 showSorted 并将其值传递给子级。 感谢您的帮助!【参考方案3】:

将数组、sortedArray 计算机属性移动到父组件 并将要显示的数组作为prop传递给子组件

处理父组件中的所有逻辑,下面是一个代码sn-p,它显示了基本操作。希望您可以根据需要进行更改。

var ChildComponent = 
  template: "<div> sortedArray </div>",
  props: 
    sortedArray: 
      type: Array,
      default: () => [],
    
  


var app = new Vue(
  el: '#app',
  components:  ChildComponent ,
  data: 
     sortBy: "",
     array: [
       name: 'Peter', age: 24,
       name: 'Beth', age: 15,
       name: 'Daniel', age: 30,
    ]
  ,
  computed: 
    displayArray() 
      // declare the compare functions
      // for name
      function cmpName(a, b) 
        if (a.name < b.name)
          return -1;
        if (a.name > b.name)
          return 1;
        return 0;
      
      // for age
      function cmpAge(a, b) 
        if (a.age < b.age)
          return -1;
        if (a.age > b.age)
          return 1;
        return 0;
      
      
      if (this.sortBy === "name") return this.array.sort(cmpName);
      else if (this.sortBy === "age") return this.array.sort(cmpAge);
      else return this.array;
    
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <select v-model="sortBy">
    <option value="">Please select a value</option>
    <option value="name">name</option>
    <option value="age">age</option>
  </select>
  <child-component :sorted-array="displayArray" />
</div>

【讨论】:

以上是关于vue onclick 对父组件中的子组件进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按设置的子对象的值对父对象进行排序

vue $attrs、$listeners使用

Vue.js 中的子组件有啥用,为啥要创建子组件?

XSLT 按两个子属性对父对象进行排序

从 Vue 中的子组件获取和设置表单值

将变量传递给 Vue.js 中的子组件