vue值改变但页面不渲染,vue中数组发生改变,页面没有渲染

  vue值改变但页面不渲染,vue中数组发生改变,页面没有渲染

  本文主要介绍vuex遇到的坑。vuex的数据发生变化,组件中的页面不呈现。有很好的参考价值,希望对你有帮助。来和边肖一起看看吧。

  vuex数据改变,组件中页面不渲染

  相信许多vuex新手都会遇到这样的问题:

  vuex数据更新后,数据在插件中的使用位置不会更新。

  这样的代码

  data() {

  返回{

  tableData:这个。$store.state.AdminInfo

  };

  }

  然后在模板中使用tableData。

  El-table:data= table data class= tablePst

  El-table-column label=登录名 prop=登录名/El-table-column

  El-table-column label=真实名称 prop=真实名称/El-table-column

  /el-table

  在这种情况下,会出现数据变化不渲染的问题。

  问题

  要解决问题,你得了解vue的生命周期。tableData在页面加载之前获取存储区中的值,并将其赋给自身,因此tableData只有一个初始值。如果稍后vuex中的状态发生变化,它将不会被再次分配给tableData。除非页面被刷新并重新加载,并且组件生命周期再次开始,否则您可以获得最新的值。

  解决

  1.在组件中去掉tableData的状态,直接在模板中使用$store.state.AdminInfo,这样就可以随时获取最新的状态值。

  El-table:data= $ store . state . admininfo class= tablePst

  El-table-column label=登录名 prop=登录名/El-table-column

  El-table-column label=真实名称 prop=真实名称/El-table-column

  /el-table

  2.使用mapState向组件公开vuex中的状态,然后使用它。详见vuex mapState官方文档。

  补充知识:解决vue修改数据页面不重新渲染问题(Vue中数组和对象更改后视图不刷新)

  Vue渲染机制及解决数据修改页面不刷新的几种方法。

  本文不讲原则,只讲干货。(我觉得我能学到知识,所以请给边肖一个赞!)

  首先,vue的底层是通过使用Object.definePropety将数据对象传递给getter和setter,所以vue不支持IE8。

  1.简要介绍对象。定义属性,

  Object.defineProperty(对象,属性,描述符)

  //参数

  目标文件

  要在其上定义属性的对象。

  支柱

  要定义或修改的属性的名称。

  描述符

  要定义或修改的属性描述符

  var obj={}

  Object.defineProperty(obj, name ,{

  get: function() {

  Console.log(我的名字是名字);

  返回名称;

  },

  集合:函数(值){

  Console.log(“您的姓名”值)

  名称=值;

  }

  });

  Obj.name=张三;//你叫张三

  我叫张三,在obj.name//.

  从上面我们可以简单的发现。当我们给这个对象的name属性赋值时,我们会触发set方法,当我们得到name属性时,我们会触发get方法。

  2.所以vue中数据写的属性可以转换成getter和setter,换句话说就是响应式的。在数据之外定义的其他数据呈现为无响应,这意味着在更改数据后不会刷新页面,因此页面上要呈现的所有数据都必须写入数据中。

  不需要的可以在此定义,

  var vm=new Vue({

  数据:{

  答:1

  }

  })

  //`VM.a `有反应。

  vm.b=2

  // VM . b 没有响应。

  3.简单介绍完之后,再来列举几个不刷新的例子。当然,以上也是一种

  第一种:修改对象的某一属性

  Vue只会把数据中已经声明的属性改成响应,没有声明的不会响应。

  模板

  差异

  列表“{item}}/div中的div v-for=”项

  按钮@click=click 更改/按钮

  Button @click=hadelClick 解决方案/button

  /div

  /模板

  脚本

  导出默认值({

  data(){

  返回{

  列表:{a:a ,b:b},

  }

  },

  方法:{

  单击(){

  //未声明不触发呈现

  this.list.c=c

  },

  hadelClick(){

  //解决方法,使用vue提供的$set方法触发渲染

  这个。$set(this.list, d , d )

  }

  }

  })

  /脚本

  当然,如果我们想要添加多个属性,我们可以使用Object.assign()将所有可枚举属性的值从一个或多个源对象复制到目标对象,并返回给目标对象。(简单来说就是合并到第一个参数中)

  this.list=Object.assign({},this.list,{c:c ,d:d})

  第二种:修改数组对象的某一属性

  模板

  差异

  列表“{item.a}}/div中的div v-for=”项

  按钮@click=click 更改/按钮

  Button @click=hadelClick 解决方案/button

  /div

  /模板

  脚本

  导出默认值({

  data(){

  返回{

  列表:[{a:vue},{a:react},{a:js}],

  }

  },

  方法:{

  单击(){

  //如果要像这样直接给数组中的对象赋值,就不能动态呈现(即数据改变,页面不呈现)

  This.list[0]={a:css} //不呈现页面

  console . log(this . list)//[{ a: CSS },{a:react},{a:js}]

  },

  hadelClick(){

  //解决方法,使用vue提供的$set方法触发渲染

  这个。$set(this.list[1], a , css )

  console . log(this . list)//[{a:css},{ a: CSS },{a:js}]

  }

  }

  })

  /脚本

  当然,如前所述,vue会遍历data中的数据,将对象转换成setter和getter。所以数组中的也不例外,所以上面的操作

  更改为:

  单击(){

  This.list[0]。a=css //仍然可以触发setter。实现数据重渲染。

  }

  }

  在vue中更多的是数组的操作不刷新,一个是通过索引赋值,一个是修改数组的长度。如何解决这个问题?

  vue官方也给了方法

  数组的API,可以改变原来的数组可以触发更新;

  1、推送()

  2、流行()

  3、移位()

  4、未换档()

  5、拼接()

  6、排序()

  7、反转()

  第二种是返回一个新的数组,这个数组从根本上改变了它的引用地址,这样的赋值可以触发更新(这是处理不刷新的思路,即改变引用地址重新赋值可以触发更新)。

  简单来说,API with array就是直接用原来的数组接收改变后的数组,

  模板

  差异

  列表“{item.a}}/div中的div v-for=”项

  Button @click=click 更改原始数组/按钮

  Button @click=hadelClick 不会更改原始数组/按钮

  /div

  /模板

  脚本

  导出默认值({

  data(){

  返回{

  列表:[{a:vue},{a:react},{a:js}],

  }

  },

  方法:{

  单击(){

  //更改数组以刷新页面

  this.list.push({a:css})

  },

  hadelClick(){

  //重新赋值以刷新页面

  this.list=this.list.map(item={

  item.a=css

  退货项目

  })

  }

  })

  /脚本

  最后提供解决思路(以上都搞不定的话)

  对象和数组都是通过引用传递的。要成为一个新数组并接受它,您需要更改源,

  第一种

  设arr=[]//新数组

  This.list.forEach(item={ //要呈现的数组

  //执行你的操作,最后放入arr

  arr.push(项目)

  })

  This.list=arr //相当于返回一个新数组来触发渲染

  第二种

  //你想直接改变渲染数组中的数据,但是没有渲染

  //解决方法:

  设arr=this . list . slice(0);//深度复制,(相当于一个新数组)

  arr.forEach(item={

  //执行您的操作。

  })

  //赋值操作

  this.list=arr

  当然,这只是简单介绍。深度复制的详细介绍,请自行百度。

  如果以上都不能执行,但是你的数据被虚假修改,可以用这个。$forceUpdate()方法(强制刷新)。

  //这个。$ force update();//strong制刷新

  模板

  差异

  列表“{item.a}}/div中的div v-for=”项

  按钮@click=click 更改/按钮

  Button @click=hadelClick 解决方案/button

  /div

  /模板

  脚本

  导出默认值({

  data(){

  返回{

  列表:[{a:vue},{a:react},{a:js}],

  }

  },

  方法:{

  单击(){

  This.list[0]={a:css} //不呈现页面

  console . log(this . list)//[{ a: CSS },{a:react},{a:js}]

  },

  hadelClick(){

  This.list[0]={a:css} //不呈现页面

  console . log(this . list)//[{ a: CSS },{a:react},{a:js}]

  这个。$ force update();//strong制刷新

  }

  }

  })

  /脚本

  上面vuex遇到的坑,vuex数据变化,组件中的页面没有渲染,都是边肖分享的内容。希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: