【问题标题】:Multiple select Vue.js and computed property多选 Vue.js 和计算属性
【发布时间】:2017-08-31 15:44:28
【问题描述】:

我正在使用 Vue.js 2.0 和 Element UI 库。

我想使用多项选择将某些角色分配给我的用户。

收到所有可用角色的列表并将其分配给availableRoles。因为它是一个对象数组,而v-model 只接受一个有值的数组,所以我需要通过计算属性computedRoles 提取角色的id

我的用户的当前角色被接收并分配给userRoles: [{'id':1, 'name':'Admin'}, {'id':3, 'name':'User'}]

computedRoles 等于 [1,3]

选择的预选很好,但我无法更改任何内容(从选择中添加或删除选项)

出了什么问题以及如何解决?

http://jsfiddle.net/3ra1jscx/3/

<div id="app">
    <template>
      <el-select v-model="computedRoles" multiple placeholder="Select">
        <el-option v-for="item in availableRoles" :label="item.name" :value="item.id">
        </el-option>
      </el-select>
    </template>
</div>

var Main = {
    data() {
      return {
        availableRoles: [{
          id: 1,
          name: 'Admin'
        }, {
          id: 2,
          name: 'Power User'
        }, {
          id: 3,
          name: 'User'
        }],
        userRoles: [{'id':1, 'name':'Admin'}, {'id':3, 'name':'User'}]
      }
    },

    computed : {

        computedRoles () {
            return this.userRoles.map(role => role.id)
        }
    }
  }

【问题讨论】:

    标签: javascript vuejs2


    【解决方案1】:

    我主要同意@wostex 的回答,但他没有给你userRoles 属性。本质上你应该交换computedRolesuserRolesuserRoles 成为计算属性,computedRoles 是数据属性。在我的更新中,我将 computedRoles 的名称更改为 selectedRoles

    var Main = {
        data() {
          return {
            availableRoles: [{
              id: 1,
              name: 'Admin'
            }, {
              id: 2,
              name: 'Power User'
            }, {
              id: 3,
              name: 'User'
            }],
            selectedRoles:[1,2]
          }
        },
        computed : {
          userRoles(){
             return this.availableRoles.reduce((selected, role) => {
                 if (this.selectedRoles.includes(role.id))
                        selected.push(role);
                 return selected;
             }, [])
          }
        }
      }
    var Ctor = Vue.extend(Main)
    new Ctor().$mount('#app')
    

    这里是fiddle

    【讨论】:

      【解决方案2】:

      查看解决方案:jsfiddle

      这里需要注意的是,计算属性主要是 getter。您可以为计算属性定义 setter,但我认为我的方法更像 vue。

      简而言之,而不是 v-model 在计算集 v-model 上用于数据属性。

      完整代码:

      <script src="//unpkg.com/vue/dist/vue.js"></script>
      <script src="//unpkg.com/element-ui/lib/index.js"></script>
      <div id="app">
      <template>
        <el-select v-model="ids" multiple placeholder="Select" @change="logit()">
          <el-option v-for="item in availableRoles" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </template>
      </div>
      
      var Main = {
          data() {
            return {
              availableRoles: [{
                id: 1,
                name: 'Admin'
              }, {
                id: 2,
                name: 'Power User'
              }, {
                id: 3,
                name: 'User'
              }],
              userRoles: [{'id':1, 'name':'Admin'}, {'id':3, 'name':'User'}],
              ids: []
            }
          },
          mounted() {
              this.ids = this.userRoles.map(role => role.id);
          },
          methods: {
              logit: function() {
              console.log(this.ids);
            }
          }
        }
      var Ctor = Vue.extend(Main)
      new Ctor().$mount('#app')
      

      【讨论】:

        猜你喜欢
        • 2017-08-26
        • 1970-01-01
        • 2019-08-08
        • 2017-10-06
        • 2017-10-07
        • 2018-01-09
        • 1970-01-01
        • 2016-09-17
        • 2018-01-25
        相关资源
        最近更新 更多