【问题标题】:Vue js passing data owned by component to methods owned by componentVue js将组件拥有的数据传递给组件拥有的方法
【发布时间】:2019-12-01 19:48:04
【问题描述】:

尝试将 vue 组件的“数据”中的不同数组传递给同一 vue 组件中的方法。我试图这样做是为了让不同的变量受相同的方法影响,而不必为每个变量使用单独的方法。

尝试将变量作为参数传递给方法,但它没有按预期响应。似乎传递的变量是数据变量的副本,而不是实际值。我想这样做是为了允许在方法中修改数据,然后再显示在页面上

示例数据:

data () {
   return { 
      a: [],
      b: []
  }
}

我希望观察者如何工作:

a {
   this.method(this.a)
}

b {
   this.method(this.b)
}

方法:

method(value) {
   value.add(1)
}

当前结果是 a 和 b 不会改变

【问题讨论】:

    标签: vue.js vue-component


    【解决方案1】:

    Watchers 必须是函数,你可以这样做:

      watch: {
        a: function(aNewValue) {
          this.method(aNewValue)
        }
      }
    

    无论如何,如果您打算每次变量更改时都会触发另一个变量的更改,那么您应该使用计算属性。

    【讨论】:

    • 最终采用计算属性方法并使其工作
    【解决方案2】:

    更新

    根据您的 cmets,您似乎正在尝试在组件中重用一个方法来改变视图模型中的两个不同数组。

    您可以创建一个获取集合、值和要运行的操作的方法。

    注意:这可能最终会使您的 html 绑定有点混乱,因为您需要有类似的东西:

    <button type="button" @click="this.mutate(a, 'a', (c, v) => c.push(v))">Add to a</button>
    

    这是一个示例 sn-p,其中使用共享方法对数组进行变异和过滤。我添加了包装器方法以保持 html 绑定干净(最终方法数量相同但重复更少)。

    Vue.component('some-component', {
       template: `
       <div>
         <div>a: {{a}}</div>
         <div>b: {{b}}</div>
         <button type="button" @click="onAdd(a, 'a')">Add to a</button>
         <button type="button" @click="onSplice(a, 1)">Splice a</button>
         <br>
         <button type="button" @click="onAdd(b, 'b')">Add to b</button>
         <button type="button" @click="onSplice(b, 1)">Splice b</button>
       </div>
       `,
       data:() => ({ a: [], b: [] }),
       methods: {
           mutate(collection, value, callback){
              callback(collection, value);
           },
           onAdd(collection, value) {
               this.mutate(collection, value, (c, v) => c.push(v));
           },
           onSplice(collection, value) {
                this.mutate(collection, value, (c, v) => c.splice(0, value));
           }
       }
    })
    
    new Vue({
      el: '#app',
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    <div id="app">
      <some-component></some-component>
    </div>

    【讨论】:

    • 我的错误,我写得很快,在我的方法调用我的理论观察者之前忘记写这个。我一直在用它前面调用方法。我相信您设置事物的方式也适用于我,但前提是我不想改变数据值。您拥有的方法只是显示列表的长度,但我希望通过将某些内容推送给它或对其进行过滤等方式在方法本身中对其进行变异。
    • 这样做的原因是我想让观察者中发送的新数据在页面上显示之前对其进行一些计算
    • 没问题,我更新了答案以涵盖该场景。
    • 实际上遇到了另一个问题。对于您提供的示例,这似乎工作正常,但是当将要使用的集合(即 a 或 b)传递给我在观察者中的方法时,数据变量不会改变
    • 试图构建一个示例来显示我正在处理的失败。尽管在我构建的示例中一切正常,但我无法复制失败。一定是我正在做的其他事情导致了问题,如果我找出导致问题的原因,我会进一步调查并更新它。您的解决方案确实解决了我所描述的问题,它看起来像否则是不对的。
    猜你喜欢
    • 2016-09-24
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2018-11-09
    相关资源
    最近更新 更多