阵列反应性问题

Posted

技术标签:

【中文标题】阵列反应性问题【英文标题】:Array Reactivity Issues 【发布时间】:2018-01-12 23:45:51 【问题描述】:

我遇到了数组反应性问题,请参阅此示例:https://jsfiddle.net/jk1kadxq/

var app = new Vue(
  el: "#app",
  data: function () 
  	return 
    	grid: 
      	rows: []
      
    
  ,
  methods: 
  	addRow: function () 
    	this.grid.rows.push();
    ,
    setRow: function (row) 
    	console.log(row);
    	this.$set(row, 'cell', 'Test');
    
  ,
  watch: 
  	'grid.rows': 
      deep: true,
      handler: function (rows, oldRows) 
      	console.log('Rows updated', rows, oldRows);
      
    
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.js"></script>
<div id="app">
  <table>
    <tr v-for="row in grid.rows">
      <td><input type="text" v-model="row.cell"></td>
      <td><button type="button" @click="setRow(row)">Set</button></td>
    </tr>
  </table>
  <button type="button" @click="addRow">Add</button>
</div>

    如果没有手动编辑行,单击“设置”按钮会将字段设置为“测试”,并且对其的所有进一步更新都会在观察程序中捕获。

    如果先手动编辑了一行,则不会触发观察者,并且单击“设置”按钮不会立即更新该字段。添加另一行会更新当前行。

有没有不同的方法来添加新的数组成员?这个页面说可以添加:https://vuejs.org/v2/guide/list.html

【问题讨论】:

【参考方案1】:

我已经解决了这个问题...对象的所有属性都应该被初始化。

所以就我而言,添加行的正确方法是:this.grid.rows.push(cell: '');

在绑定到控件时初始化对象属性会很好,如果还没有初始化的话。

【讨论】:

以上是关于阵列反应性问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在阵列适配器中长按时设置按钮的可见性

R 中的反应性问题 - 你试图做一些只能从反应性消费者内部完成的事情

结合反应性和事件反应性来生成绘图

Vue.js 3 - 替换/更新反应性对象而不会失去反应性

苗条的反应性

Svelte 反应性如何在函数内部工作?