对VUE中的对象添加属性

时间: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邮箱联系删除。

相关文章