• 响应式对象添加 响应式属性的三种方式;响应式对象添加属性后页面不更新


    目录

    一、问题

    二、解决方法

    三、总结


    一、问题

    1.一个表单里有由上下两部分组成:在未归档时,上面一部分数据baseMsg有些可以编辑,有些不可以编辑,下面一部分数据inhospital不可以编辑;在归档后全部不可以编辑,可以用一个type值来标识每个字段是否可以编辑;。

    有两种解决方法:

    1)初始化的时候就给每个字段加上一个type属性和初始化值。可以实现,但是对于未归档时下面一部分数据都不可以编辑和归档后全部不可以编辑这两种情况而言,每个字段都添加type显然是冗余的。

    2)考虑在初始化每个字段值时,循环添加type。可以减少下面一部分数据手动添加type。但是遇到了问题:添加了type属性后,对象里也添加了对应的值,但是页面不按照预期显示:在未归档时不可以编辑的部分仍然可以编辑,归档时和未归档时显示的完全一样。

    二、解决方法

    表单数据 patientInfo结构如下:

    1. const patientInfo = reactive({
    2. baseMsg: {
    3. title: '基本信息',
    4. inputContent: {
    5. patientname: {
    6. label: '姓名',
    7. type: 'textarea',
    8. maxlength: 30,
    9. value: ''
    10. },
    11. gender: {
    12. label: '性别',
    13. type: 'radio',
    14. value: '',
    15. radios: [
    16. {
    17. label: '男',
    18. value: 1
    19. },
    20. {
    21. label: '女',
    22. value: 2
    23. },
    24. {
    25. label: '其他',
    26. value: 0
    27. }
    28. ]
    29. },
    30. height: {
    31. label: '身高',
    32. type: 'input',
    33. isNumber: true,
    34. value: ''
    35. },
    36. weight: {
    37. label: '体重',
    38. type: 'input',
    39. isNumber: true,
    40. value: ''
    41. },
    42. mobile: {
    43. label: '手机号',
    44. type: 'input',
    45. isNumber: true,
    46. value: ''
    47. },
    48. age: {
    49. label: '年龄',
    50. type: 'disabled',
    51. value: ''
    52. },
    53. bloodtype: {
    54. label: '血型',
    55. type: 'disabled',
    56. value: ''
    57. },
    58. idcard: {
    59. label: '身份证号码',
    60. type: 'disabled',
    61. value: ''
    62. },
    63. borntime: {
    64. label: '出生日期',
    65. type: 'disabled',
    66. value: ''
    67. },
    68. }
    69. },
    70. inhospital: {
    71. title: '住院信息',
    72. inputContent: {
    73. inpatientid: {
    74. label: '住院号码',
    75. // type:'',
    76. value: ''
    77. },
    78. roomname: {
    79. label: '病房号',
    80. value: ''
    81. },
    82. bedname: {
    83. label: '床号',
    84. value: ''
    85. },
    86. nursename: {
    87. label: '责任护士',
    88. value: ''
    89. },
    90. actionsdoctorname: {
    91. label: '主治医生',
    92. value: ''
    93. },
    94. departmentname: {
    95. label: '所在科室',
    96. value: ''
    97. },
    98. entryhospital: {
    99. label: '入院时间',
    100. value: ''
    101. },
    102. inhosdays: {
    103. label: '住院天数',
    104. value: ''
    105. },
    106. operationdays: {
    107. label: '手术天数',
    108. value: ''
    109. },
    110. leavehospital: {
    111. label: '出院日期',
    112. value: ''
    113. },
    114. isfasting: {
    115. label: '禁食',
    116. value: ''
    117. },
    118. isolation: {
    119. label: '隔离',
    120. value: ''
    121. },
    122. criticallevel: {
    123. label: '病情',
    124. value: ''
    125. },
    126. diagnosis: {
    127. label: '主要诊断',
    128. value: ''
    129. }
    130. }
    131. }
    132. });

    1.通过console.log打印发现,我 直接用obj.type='disabled循环添加的 type不是响应式的(对象的原型链上没对应的有 get/set方法)。

    1)代码如下

    1. const initData = () => {
    2. for (let item in patientInfo) {
    3. let temp = patientInfo[item].inputContent;
    4. for (let key in temp) {
    5. if (isShowSave) {
    6. switch (item) {
    7. // 住院信息全部不可编辑
    8. case 'inhospital':
    9. // 非响应式数据不可以
    10. temp[key].type = 'disabled';
    11. // 下面两个都可以
    12. // temp[key] = Object.assign({}, temp[key], { type: 'disabled' });
    13. // _this.$set(temp[key],'type','disabled')
    14. console.log("patientInfo",patientInfo)
    15. break;
    16. default:
    17. break;
    18. }
    19. }
    20. // 已归档患者全部不可编辑
    21. else {
    22. temp[key] = Object.assign({}, temp[key], { type: 'disabled' });
    23. }
    24. switch (key) {
    25. case 'criticallevel':
    26. temp[key].value = currentOperaMsg['criticallevelvalue']
    27. ? currentOperaMsg['criticallevelvalue']
    28. : emptyValue;
    29. break;
    30. case 'gender':
    31. temp[key].value = currentOperaMsg['genderKey'];
    32. break;
    33. default:
    34. temp[key].value = currentOperaMsg[key];
    35. // 不可编辑且为空值的填充 默认值
    36. if (!currentOperaMsg[key] && temp[key].type === 'disabled') {
    37. temp[key].value = emptyValue;
    38. }
    39. break;
    40. }
    41. }
    42. }
    43. };

    2)结果:type变量不是响应式

    图1 直接添加属性type,没有get,set方法,type是非响应式的

     

    2.使用

    a. obj=Object.assign({},obj,{type:'disabled'})

    b. this.$set(obj,'type','disabled')

    c.obj.type='disabled';  obj=JSON.parse(JSON.stringify(obj);

    1)代码如下

    1. const initData = () => {
    2. for (let item in patientInfo) {
    3. let temp = patientInfo[item].inputContent;
    4. for (let key in temp) {
    5. if (isShowSave) {
    6. switch (item) {
    7. // 住院信息全部不可编辑
    8. case 'inhospital':
    9. // 非响应式数据不可以
    10. // temp[key].type = 'disabled';
    11. // 下面两个都可以
    12. temp[key] = Object.assign({}, temp[key], { type: 'disabled' });
    13. // _this.$set(temp[key],'type','disabled')
    14. console.log("patientInfo",patientInfo)
    15. break;
    16. default:
    17. break;
    18. }
    19. }
    20. // 已归档患者全部不可编辑
    21. else {
    22. temp[key] = Object.assign({}, temp[key], { type: 'disabled' });
    23. }
    24. switch (key) {
    25. case 'criticallevel':
    26. temp[key].value = currentOperaMsg['criticallevelvalue']
    27. ? currentOperaMsg['criticallevelvalue']
    28. : emptyValue;
    29. break;
    30. case 'gender':
    31. temp[key].value = currentOperaMsg['genderKey'];
    32. break;
    33. default:
    34. temp[key].value = currentOperaMsg[key];
    35. // 不可编辑且为空值的填充 默认值
    36. if (!currentOperaMsg[key] && temp[key].type === 'disabled') {
    37. temp[key].value = emptyValue;
    38. }
    39. break;
    40. }
    41. }
    42. }
    43. };

    2)结果:type变量变成响应式的,页面也正常显示不可编辑的状态

     

    三、总结

    1.添加响应式属性的方法

      a. obj=Object.assign({},obj,{attributeName:'value})

      b. this.$set(obj,'attributeName','value');

      c. obj.attributeName=value;obj=JSON.parse(JSON.stringify(obj))

      注:其中a,c都是手动生成了一个新的对象,然后赋值给原对象

             b是 vue 内部提供的给对象添加 响应式属性的方法。

    /*

    希望对你有帮助!

    如有错误,欢迎指正,非常感谢!

    */

  • 相关阅读:
    对话框 QDialog ( 详解 )
    基于鲲鹏服务器搭建简单的开源论坛系统(LAMP)实践分享
    Java二分查找
    Abnova丨Abnova 抗独特型单克隆抗体的分类和特色
    PHP语言之正则表达式
    关系型数据库和非关系型数据库之间的区别
    迅为RK3568开发板QT学习手册
    ASEMI肖特基二极管SBT10100VCT参数,SBT10100VCT应用
    PX4模块设计之三十九:Commander模块
    作业 day4
  • 原文地址:https://blog.csdn.net/qq_45327886/article/details/127647330