【问题标题】:Vue data, computed, and methodsVue 数据、计算和方法
【发布时间】:2019-09-02 17:10:59
【问题描述】:

想知道我是否应该使用方法直接更新data() 中可能较大的数组,或者让该方法在data() 中设置另一个原始属性并使用computed 来使用该方法返回更改后的数组?以下两种方法的示例:

方法一:

data() {
  return {
    users: [
      {
        name: 'alice'
        selected: true
      },
        name: 'bob'
        selected: false
// ...
methods: {
  handleSelection(selectedIndex) {
    this.users = this.users.map((item, index) => {
      item.selected = selectedIndex === index ? true : false;
      return item;
    });
  }

方法 #2:

data() {
  return {
    selectedIndex: 0,
    users: [
      {
        name: 'alice'
        selected: true
      },
        name: 'bob'
        selected: false
// ...
computed: {
  usersSelected() {
    return this.users.map((item, index) => {
      item.selected = this.selectedIndex === index ? true : false;
      return item;
    });
  }
//...
methods: {
  handleSelection(selectedIndex) {
    this.selectedIndex = selectedIndex;
  }

其中一个比另一个更好还是有任何其他建议/改进?谢谢!

【问题讨论】:

  • 根据您的代码,一次只能有 1 个选定用户,但我看到 usersSelected() 其中“用户”是复数,它与您的代码相矛盾。哪一个是正确的?
  • 计算属性通常是正确的方法,因为您无需担心手动重新计算值。
  • @YongQuan - usersSelected() 是一个糟糕的名称选择,但我不能称它为 users(),因为这将与 Vue 中 data() 中的 users 命名冲突。也许应该叫它usersComputed()
  • 那么整个集合中只有一个selected: true的用户是真的吗?
  • @YongQuan - 是的,但那个细节与我无关 - 只是想知道使用计算是否更好。

标签: vue.js


【解决方案1】:

您应该使用计算属性。这样一来,您就不必担心记住调用各种方法来保持数据同步。

您的计算属性可以根据您的要求变得更简单。

new Vue({
  el: '#app',
  data: {
    selectedUserIndex: null,
    users: [{
        name: 'Mark',
        id: 1
      },
      {
        name: 'John',
        id: 2
      },
      {
        name: 'Evan',
        id: 3
      }
    ]
  },
  computed: {
    selectedUser() {
      return this.selectedUserIndex >= 0
        ? this.users[this.selectedUserIndex]
        : null
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <p>
    Selected user:
    <span v-if="selectedUser">{{selectedUser.name}}</span>
    <em v-else>No user selected</em>
  </p>

  <ul>
    <li @click="selectedUserIndex = index" v-for="(user, index) in users" :key="user.id">
      {{user.name}}
    </li>
  </ul>
</div>

【讨论】:

  • 需要将所有用户传递给第三方组件,所以我必须在数组中的所有对象上定义 selected 属性,但我会接受你的回答。
  • 听起来可以避免。如果我需要更新答案,请告诉我。
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 2018-03-23
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多