首页 > 其他分享 >vue 中使用 this 更新数据的一次大坑

vue 中使用 this 更新数据的一次大坑

时间:2022-11-23 20:13:10浏览次数:45  
标签:vue 函数 大坑 更新 books 格式 回调

情景说明:

之前用 vue 做数据绑定更新时,发现一个莫名奇妙的问题。

我在 vue 实例中声明了一个数组属性如 books: [],在异步请求的回调函数中使用 this.books = res.data.data; 进行数据更新,更新步骤后面紧跟着打印了 console.log(this.books),打印数据显示确实更新成功!但页面数据渲染无论是 {{books.length}} 还是 {{books}} 都显示没有数据!!!

这就脑瓜子疼了,花了老长时间反复证明了:this.books 数据肯定更新上去了,但它喵的 {{books}} 就是不显示!

敲重点:我是在 axios 的回调函数中使用的 this 更新数据!

最后想起了一个小细节,axios 异步通信的回调函数我用的是函数表达式 axios({xxx}).then(function(res){xxx}),格式示例如下:

axios({
    url: url,
    method: "get",
    headers: {
        token: token
    }, //自定义请求头数据传递token
    params: {
        userId: userId
    }
}).then(function(res) {
    //上面的回调函数用的标准格式
	}
});  

使用这种格式的回调函数写法,如果在回调函数中,使用 this,那么,这个 this 就不是 vm(ViewModel) 对象了,而是回调函数自身这个对象!!!

所以,使用这种回调函数写法,在回调函数中,就不能使用类似 this.books 进行数据更新!只能使用 vm.books(vm 指的是创建 vue 实例对象时的引用或对象属性名称)来进行对 vue 对象数据的更新。

如果想使用 this 来实现数据更新,那就必须使用回调函数的简写格式:axios({xxx}).then((res)=>{xxx}),格式示例如下:

axios({
    url: url,
    method: "get",
    headers: {
        token: token
    }, //自定义请求头数据传递token
    params: {
        userId: userId
    }
}).then((res)=>{
    //上面的回调函数用的简写格式
    }
});        

使用这种简写格式的回调函数写法,就可以直接在回调函数中使用 this,此时,这个 this 也是 vm(ViewModel) 对象!!!

PS:好吧,这细节也是没谁了,也怪我自己突然没注意到,使用了标准格式的回调函数写法~

但是,话说 ,为什么它喵的,使用标准格式写法,this 指的不是 vue 实例对象,但是用它更新的数据如 this.books 也给更新上去了,打印出来也真的是一点毛病没有???

标签:vue,函数,大坑,更新,books,格式,回调
From: https://www.cnblogs.com/luisblog/p/16919628.html

相关文章

  • abap: 一个 成本估算不能标记和发布问题的跟踪调试案例(对于 0 物料, 0 成本评估被成
    一个成本估算不能标记和发布的跟踪案例: 为了避免用户数据的干扰,我首先将料号20101115的估算全都册除了(事务:CKR1)然后重新做估算。确认估算保存无错。 然后再用CK2......
  • npm 如何更新项目最新依赖包
    NPM是什么?Node软件包管理器(NPM)提供了各种功能来帮助你安装和维护项目的依赖关系。由于错误修复、新功能和其他更新,依赖关系可能会随着时间的推移而变得过时。你的项目......
  • vite +vue3 项目搭建
    创建项目npmcreatevite@latestdemo配置环境变量vite提供了开发模式和生产模式这里我们可以建立4个.env文件,一个通用配置和三种环境:开发、测试、生产。env文......
  • VUE3使用Vue-Toastification
    官方地址:https://vue-toastification.maronato.dev/?from=madewith.cn需求:要搞一个实时提醒弹窗,刚开始用的elementplus里的Notification,但后面原型图又改了,加上了交互......
  • Vue遍历data中某个字段并累加,res.result.forEach方法总结
    forEach的定义和方法:forEach()方法用于调用数组的每个元素,并将元素传递给回调函数。注意:forEach()对于空数组是不会执行回调函数的。一、html部分<divclass="tab-con......
  • vue组件-文本超出显示点点点且悬浮可查看所有内容
    需求当文本超出的时候需要显示点点点,然后鼠标悬浮其上要能查看所有的文本内容。就直接封装一个通用的组件。依赖项element-plusvue3组件存放目录新建vue文件/compo......
  • Vue 初识
    官方地址地址:https://cn.vuejs.org/安装Vue库地址:https://v2.cn.vuejs.org/v2/guide/installation.html 安装浏览器调试工具 另外一种方式安装Vue-devtools......
  • Mongodb更新操作
    MongoDB提供以下方法来更新集合中的文档:update:更新或替换匹配指定过滤器的单个文档,或更新与指定过滤器匹配的所有文档,要更新多个文档,请使用multi选项。updateOne:更新单个......
  • vue2源码学习1
    1.vue源码解读流程newVue调用的是Vue.prototype._init从该函数开始经过$options参数合并之后initLifecycle初始化生命周期标志初始化事件,初始化渲染函数。......
  • 基于飞书通讯录搭建本地LDAP服务(钉钉、企业微信配置后续更新)
    目前飞书社交办公应用成为公司日常沟通办公的协作工具,以及作为各种流程的审批处理系统,HR 也会在飞书上去管理所有员工的状态及组织架构。随着公司内新部署的业务系统越来越......