当前位置:首页 > 前端 > 正文内容

关于vue2中data值为不定长对象动态更改页面不生效的终极解决方案

Z先生4年前 (2021-12-14)前端797

问题描述

子组件,定义了空data值,通过参数传递过来,通过watch修改,页面不更新,日志输出确定内容已经改过来。

已经测试方案

找了很多方案,this.$forceUpdate()this.$nextTick().then(() =>{})setTimeout深度克隆this.$set()均无效

终极解决方案

这里只展示脚本部分

<script>
  export default {
    components: {},
    props: {
      show: {
        type: Boolean,
        default: false,
      },
      data: {
        type: Object,
        default: null,
      },
    },
    data() {
      return {
        formData: {},
        rowData: {},
        drawerShow: false,
        confirmLoading: false,
      }
    },
    computed: {
      tmpData: {
        get: function () {
          let configData = this.data.config
          let fromData = { ident: this.data.ident }
          fromData = Object.assign({}, fromData, configData)
          return fromData
        },
        set: function (value) {
          this.fromData = value
        },
      },
    },
    watch: {
      tmpData(val) {
        this.formData = val
      },
      data(val) {
        this.rowData = val
      },
      show(val) {
        this.drawerShow = val
      },
    },
    beforeCreate() {
    },
    created() {},
    mounted() {
    },
    methods: {
      drawerClose() {
          //父组件要通过 :show.sync调用才生效
        this.$emit('update:show', false) //自定义事件会告诉父组件将父组件的 show值改为false,并传回给子组件。
      },
      clickSubmit() {

      }

      clickCancel() {
        this.drawerClose()
        this.$emit('cancel')
      },
    },
  }
</script>

代码解析:页面上用到的是formData,直接通过watch中的data监听修改formData无效,所以在computed中,加入了tmpData作为中间值,然后在watch中监听tmpData的变化,将变化值交给formData,然后就没问题了。

分享给朋友:

相关文章

小程序二维码传参处理&UNIAPP H5传参兼容处理

首先小程序生成二维码,我这里调用的接口是:getUnlimited,我传递的参数是:invite=10001接着就是小程序中处理,如果直接扫二维码在App.vue的onLaunch中,使用decode...

去掉H5中number输入框的上下箭头

方法一:CSS样式处理input::-webkit-outer-spin-button, input::-webkit-inner-spin-button{    &...

实现 OpenSearch(Tab to Search)功能

在网站上添加了 OpenSearch 功能以后,IE 7.0 和 Firefox 2.0 以上的浏览器就能够在自带的搜索栏里面添加这个网站的搜索功能了。第一:原始网站支持GET传递参数搜索:第二:编写...

IE11,Chrome粘贴图片上传的JS实现方法和逻辑

核心代码如下://处理IE11,Chrome粘贴图片上传 function pasteUpload() { var file = null;...

字体图标的妙用

什么是字体图标对于前端的小伙伴来说,字体应该是再熟悉不过的东西了,对于文字我们可以通过css指定文字对应的字体,字号大小,颜色。得益于css3,我们还可以在css中引入服务端字体来实现自定义字体。而字...

VUE打包时from UglifyJs Unexpected token: punc (()错误解决方案

归其原因是因为缺少ES2015的语法解析。因此进行如下2步操作即可解决问题:1、安装babel-preset-es2015npm install babel-preset-es20...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。
请先 登录 再评论,若不是会员请先 注册