美文网首页
React 数组变化不引起视图更新

React 数组变化不引起视图更新

作者: EasonChan94 | 来源:发表于2019-01-07 14:40 被阅读0次
import React, { Component } from 'react';
import './App.css';
import Todo from './components/todo/index'
import { Table, Button } from 'element-react';
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      columns: [
        {
          label: "日期",
          prop: "date",
          width: 180
        },
        {
          label: "姓名",
          prop: "name",
          width: 180
        },
        {
          label: "地址",
          prop: "address"
        }
      ],
      data: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      },{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }]
    }
  }
  render() {
    return (
     <div>
       <Todo list={this.state.data}/>
       <Table
           style={{width: '100%'}}
           columns={this.state.columns}
           data={this.state.data}
       />
       <Button type="primary" onClick={this.addData.bind(this)}>添加</Button>
     </div>
    );
  }

  addData () {
    let obj = {
      date: '2018-05-07',
      name: '小明',
      address: ''
    };
    let data = this.state.data;

    data.push(obj);
    this.setState({
      data: data
    });
    console.log(this.state);
  }
}

export default App;

上面代码中 通过setState设置data的值发现视图并没有更新,原因是数组的赋值是引用传递的,data = this.state.data是执行data这个数组的内存,所以执行data.push(obj)实际上相当于执行了 this.state.data.push(obj),所以react的虚拟dom发现state里面的data没有变化,所以不更新视图,而这时可以使用一个新数组:

 let data = [...this.state.data];

代码改为:

import React, { Component } from 'react';
import './App.css';
import Todo from './components/todo/index'
import { Table, Button } from 'element-react';
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      columns: [
        {
          label: "日期",
          prop: "date",
          width: 180
        },
        {
          label: "姓名",
          prop: "name",
          width: 180
        },
        {
          label: "地址",
          prop: "address"
        }
      ],
      data: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      },{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }]
    }
  }
  render() {
    return (
     <div>
       <Todo list={this.state.data}/>
       <Table
           style={{width: '100%'}}
           columns={this.state.columns}
           data={this.state.data}
       />
       <Button type="primary" onClick={this.addData.bind(this)}>添加</Button>
     </div>
    );
  }

  addData () {
    let obj = {
      date: '2018-05-07',
      name: '小明',
      address: ''
    };
    let data = [...this.state.data];

    data.push(obj);
    this.setState({
      data: data
    });
    console.log(this.state);
  }
}

export default App;

这样data比对以后会react会检测新旧的变化而更新dom

相关文章

  • React 数组变化不引起视图更新

    上面代码中 通过setState设置data的值发现视图并没有更新,原因是数组的赋值是引用传递的,data = t...

  • React中setState数组变化,视图没有更新

    最近学习React,在数据变化的时候遇到一个坑,必须得说说。 原因一: 做项目,一般都是先将路由配好,整个大的架子...

  • vue项目中碰到的问题

    vue项目中碰到的问题 路由懒加载写法: Vue 数组/对象更新 视图不更新深拷贝对象或者数组,视图会进行更新对象...

  • 某公司前端面试题

    1.Vue双向绑定的原理。 2、数组变化有哪些情况下不能视图不能同步更新 对于数组的变化: a、利用索引...

  • vue中视图不更新问题$set

    当数组变动时,数组长度发生了变化,但是出现视图层不更新的情况是因为在数组中增加对象{},然后给对象增加新的属性th...

  • vue 数组更新视图不更新

    众所周知,Vue.js3.0之前是使用了Object.defineProperty来实现双向数据绑定。当数据变化时...

  • React数据更新,视图不更新

    问题描述: 做日历功能的时候,发现了一个问题:切换月份发现数据更新,但是视图不更新 第一次打开日历,正常显示,没有...

  • 虚拟DOM和diff算法(React学习笔记_08)

    虚拟DOM和diff算法 React更新视图的思想是:只要state变化就重新渲染视图。组件中只有一个DOM元素需...

  • vue更改了数据但是视图却没有更新

    数据更新了但视图没有更新,常见的有两种情况:数组、对象 数组更新检测 数组有一些方法可以导致视图更新 push()...

  • React中的setState简析

    React中数据的更新操作 这里以更新数组为例说明React中数据应该如何更新 React中更新数组必须生成一个新...

网友评论

      本文标题:React 数组变化不引起视图更新

      本文链接:https://www.haomeiwen.com/subject/bcsurqtx.html