时间:2021-05-18
背景:在通过接口获取数据集对象后,根据业务场景需要在数据集对象上增加额外的属性
data中定义的数据集对象mindData格式示例如下
mindData: [{label:'清醒',value:'清醒'}, {label:'朦胧',value:'朦胧'},{label:'嗜睡',value:'嗜睡'}, {label:'昏睡',value:'昏睡'},{label:'谵妄',value:'谵妄'}, {label:'模糊',value:'模糊'}]1) 通过post调用接口获取minData对象,遍历添加属性value和content(方便后续通过v-model设置绑定radio控件的选择结果值value)
this.$http.post('XXXXXXXXXXXXXXXXXXXXXXXX', {parms:'xxx'}).then(res => {letsel= thissel.mindData= res.datafor(letitemofsel.mindData) {item.value= ''item.content=''}})2) 这里我自定义了radio控件,部分代码如下
<mt-cell:title="label"class="zm-radio mint-field"><input:placeholder="placeholder"type="text":readonly="!editable"style="margin-right: 14px;"v-model="currentContent"@click="onHandleClick"class="mint-field-core"/><spanclass="mintui mintui-back reset" @click="popupVisible=true"></span><mt-popupclass="zm-radio-popup"position="bottom"v-model="popupVisible"popup-transition="popup-fade":style="{height:popupHeight}"ref="pop"><zm-container><zm-mainref="zmRadioMain"><div@click="popupVisible=false"><mt-radiostyle="width: 100%":title="label"align="right"v-model="currentValue":options="options"></mt-radio></div></zm-main></zm-container></mt-popup></mt-cell>export default{watch: {popupVisible() {this.options= this.dictItemsthis.currentValue= this.valueletheight= this.options.length * 48letmaxHeight= window.innerHeight * 0.5if(height> maxHeight) {this.popupHeight= maxHeight+ 'px'letscrollHeight= maxHeight* maxHeight/ heightthis.$refs.zmRadioMain.setScroll(scrollHeight,window.innerWidth)}},currentValue() {console.log('radio_currentValue:'+ this.currentValue)this.$emit('input',this.currentValue)letcontent= this.contentletlabel= ''for(letitemof this.options) {if(_.isEqual(item.value,this.currentValue)) {label= item.labelbreak}}this.currentContent= content}3) 绑定到自定义的radio控件上
<zm-radiolabel="单选:":editable="false":dict-data="mindData":content.sync="data.content"v-model="data.value"></zm-radio>赋值的关键代码如下
watch: {popupVisible() {this.options= this.dictItemsthis.currentValue= this.value弹出选项框列表的时候,会把当前文本上的value值赋值给currentValue对象,这样下拉框就会自动定位显示原先的选项值,期望达到的效果如下
乍看之下,没什么问题,运行后发现
点击下拉框,弹出选项列表,怎么数据没有通过v-model绑定上去,并且radio的value和lable值一直是空
捣鼓了很久,测试发现通过定义mindRadio对象的方式绑定在zm-radio对象上,显示效果是能获得期望结果,那问题很明显,对象属性的创建有问题
<zm-radiolabel="单选:":editable="false":dict-data="mindData":content.sync="mindRadio.content"v-model="mindRadio.value"></zm-radio>data() {return{mindRadio: {code:'',value:''}}经过vue官方资料查询,提供了vue.set方法,通过以下方法解决了设置对象属性的问题
this.$http.post('XXXXXXXXXXXXXXXXXXXXXXXX', {parms:'xxx'}).then(res => {letsel= thissel.mindData= res.datafor(letitemofsel.mindData) {sel.$set(item,'value','')sel.$set(item,'content','')}})总结原因:其实问题是vue实例对象不允许直接添加属性或删除属性,需要通过set方式更新数据对象。
另一种实现方式,可以采用先给临时对象tempData添加属性,再赋值给mindData
以上这篇对VUE中的对象添加属性就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
当我们给一个比如props中,或者data中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用Vue.set方法Vue.set方法用来新增对象的属性。如
当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。{{item.mes
概念解析:1)数据代理:通过一个对象代理对另一个对象(在前一个对象内部)中属性的操作(读/写)2)vue数据代理:通过vm对象(即this)来代理data对象中
类属性和对象属性我们把定义在类中的属性称为类属性,该类的所有对象共享类属性,类属性具有继承性,可以为类动态地添加类属性。对象在创建完成后还可以为它添加额外的属性
前言在vue开发的过程中发现一个问题:改变vue.$data中对象的属性,watch是观测不到变化,但其实对象的属性是有变化的。这……,有点难以置信!正文nam