【vue】vue从服务端获取数据赋值给data,如何渲染更新视图

从服务端取到的数据需要实时反馈,否则将毫无意义!

目录

 

介绍一下Vue.set()方法

一:data中定义一个对象:

二:从服务端发起请求返回新数据对象:

三:用 Vue.set()方法更新数据

下面介绍一下第二种情况:

一:我们在data中定义一个很大的临时对象

二:我们在计算属性中也定义很大的对象

三:发起异步请求,从服务端返回数据

四:页面模板组件中使用方法


我先介绍一下Vue.set()方法

注:如果从服务端返回的数据量较少,或者只有几个字段,可以用vue的set方法,如果数据量较大,请直接看第二种情况。

官网API是这样介绍的:

Vue.set(target,key,value)

参数:

{Object | Array} target

{string | number} key

{any} value

返回值:设置完后的新值

用法:

向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性 (比如 this.myObject.newProperty = 'hi')

注意对象不能是 Vue 实例,或者 Vue 实例的根数据对象。

我举个简单的小例子,把这种用法介绍一下:

一:data中定义一个对象:

data() {

return {

person:{

age:10,

name:'李古拉雷',

sex:1

}

}

}

二:从服务端发起请求返回新数据对象:

person:{

age:20,

name:'高圆圆',

sex:0

}

这时需要把这个对象实时渲染到页面中去

三:用 Vue.set()方法更新数据

如下所示:

methods: {

getPerson(){

this.$http({

method: "post",

url:this.$$baseURL + "sys/getPerson",

}).then(res => {

Vue.set(this.person,0,{age:res.data.age,name:res.data.name,sex:res.data.sex})

/**

* 0 更新的是位置0上的数据

*

*/

});

}

}

这样从服务端返回的新数据就实时更新到组件上了。

******************************以上(Vue.set()使用方法)*****************************************

下面我说一下第二种情况:

这种情况就是数据量较大,字段较多的,使用Vue.set()方法就有点过分了,这时我们应该怎么做呢?

核心思想就是定义一个临时变量,因computed 是计算属性,这里面的值更新可以实时渲染组件更新页面。

一:我们在data中定义一个很大的临时对象

data() {

return {

myTempObj:{} // 这时一个很大的临时对象,字段特别多

}

}

二:我们在计算属性中也定义一个很大的对象

这个对象是我们在页面中真正用到的对象

computed: {

myObj: {

get: function(){

return this.myTempObj; // 在这里把临时对象的值通过计算属性赋值给页面中用到的对象

}

},

}

三:发起异步请求,从服务端返回数据

methods: {

getBigObj(){

this.$http({

method: "post",

url:this.$$baseURL + "sys/getBigObj",

}).then(res => {

this.myTempObj=res.bigObj ; // 在这里用临时变量接受服务端返回值

});

}

}

四:页面模板组件中使用方法

<div class="brand-list bybrand_list" v-for="(item, index) in myObj" :key="index">

{{item.name}}

</div>

以上两种情况都可以解决从服务端取到的数据不能实时更新问题,根据具体情况选择使用!

四年java开发,四年前端加产品。现今日头条前端架构师。欢迎关注我,技术人生如此有趣!

### Vue2 中表单数据回显失败的原因分析 在 Vue2 项目中,当遇到表单数据回显失败的情况时,通常是因为数据绑定机制未能正确触发视图更新。具体原因可能涉及以下几个方面: - 组件初始化顺序不当,导致数据未及时加载完成即渲染界面。 - 双向绑定失效,可能是由于 `v-model` 使用错误或监听器设置不合理。 - 子组件接收父级传递参数的方式存在问题。 针对上述情况,下面提供一种较为通用的解决方案[^3]。 ### 解决方案实现方法 #### 方法一:确保初始状态同步 对于初次进入编辑模式下的页面而言,应当先获取服务器端返回的数据并将其赋值给本地的状态管理对象(如 data 或者 Vuex store),再执行 DOM 渲染操作。可以通过生命周期钩子函数 `created()` 来发起请求,并利用回调处理逻辑保证异步流程结束之后才继续往下走。 ```javascript export default { name: 'EditPage', data() { return { form: {} }; }, created() { axios.get(`/api/data/${this.$route.params.id}`).then(response => { this.form = response.data; }); } } ``` 这种方法适用于简单场景下不需要复杂业务逻辑控制的情形;但如果涉及到更复杂的交互需求,则建议采用第二种方式。 #### 方法二:使用 `$nextTick` 和 `watcher` 如果希望更加灵活地应对各种变化,可以在接收到新的属性值后立即通知模板重新计算依赖关系,从而强制刷新 UI 显示。这一步骤可通过组合使用 `computed` 计算属性配合 `watch` 监听器以及内置工具方法 `$nextTick` 实现。 ```javascript export default { props: ['initialData'], data() { return { localForm: {} }; }, computed: { formData() { return {...this.localForm}; } }, watch: { initialData(newVal) { if (newVal && typeof newVal === 'object') { this.$nextTick(() => { Object.assign(this.localForm, newVal); }); } } } } ``` 此策略特别适合那些由外部因素驱动内部状态改变的应用程序部分,比如从 URL 参数读取配置项或是响应来自其他模块的消息事件等场合。 另外需要注意的是,在某些特殊情况下,像 radio 单选按钮这类控件可能会因为默认选项缺失而导致视觉上的 “空白”。这时除了要验证 API 返回的结果外,还需仔细检查 HTML 结构定义是否合理,确保每个 input 元素都有对应的 value 属性与实际模型中的键名相匹配[^4]。 #### 方法三:深拷贝防止浅层引用影响 有时即使看起来已经成功设置了表单项的内容,但由于 JavaScript 对象之间的相互关联特性,可能导致后续更改仍然会影响到原始源码里的变量副本。为了避免这种情况的发生,推荐采取深度复制技术来创建独立的一份工作副本供前端展示之用。 ```javascript import _ from 'lodash'; // ... mounted () { // 假设 serverResponse 是从服务端获得的对象 let clonedServerResponse = _.cloneDeep(serverResponse); this.form = clonedServerResponse; } ``` 借助 lodash 库提供的 `_ .cloneDeep()` 函数可以轻松达成目的,当然也可以考虑手写递归算法自行实现相同功能[^5]。 ### 注意事项 为了提高代码健壮性和用户体验满意度,开发人员还需要关注以下几点细节: - 设置合理的 loading 提示语句告知用户当前正处于等待阶段; - 添加必要的异常捕获措施预防潜在风险; - 验证所有必填字段均已填写完毕后再提交最终版本; - 测试不同浏览器环境兼容性表现差异。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值