• vue项目实际开发的问题及实用技巧分享(二)


    粗读整体项目将业务流程整体梳理了一遍,发现项目中很多“ES5老式代码”,当然我也不是说用ES5写法不行,会有BUG,只是会造成代码量增多,可读性变差。

    这里就目前维护的项目里遇到的一些整理一下:

    1、解构赋值在具体项目上的应用

    1. <el-table-column label="操作" width="100" align='center'>
    2. <template slot-scope="scope">
    3. <div v-if="isSee">
    4. <el-button @click='handleClick(scope.row,scope.$index)'>编辑el-button>
    5. div>
    6. template>
    7. el-table-column>
    8. <script>
    9. export default {
    10. methods: {
    11. handleClick(row,index){
    12. let name = row.name,
    13. age = row.age,
    14. id = row.ID,
    15. leadName = row.lead.name,
    16. leadId =row.lead.id,
    17. leadCode =row.lead.code
    18. }
    19. }
    20. }
    21. script>

    这要是在业务中涉及到更多的参数那不是得定义更多的变量。

    改进方案:

    1. handleClick({name,age,ID:id,lead},index){
    2. let {name:leadName,id:leadId:,code:leadCode} =lead||{}
    3. }

    2、关于同参数多判断条件非常复杂的情况(使用ES6新增数组实例方法includes

    1. <el-table-column prop="proAsk" label="产品工艺要求" align='center'>
    2. <template slot-scope="scope">
    3. <div v-if="isSee">
    4. <div class="tabel-input" v-if="scope.row.nameSort==4">
    5. <div
    6. v-if='scope.row.classSort==1||scope.row.classSort==2||scope.row.classSort==3||scope.row.classSort==5||scope.row.classSort==6||scope.row.classSort==7'>
    7. <el-form-item :prop="'tableDatas.'+scope.$index+'.proAsk'" :rules="rules.proAsk">
    8. <el-input v-model="scope.row.proAsk" center>el-input>
    9. el-form-item>
    10. div>
    11. <div v-else>
    12. <el-input v-model="scope.row.proAsk" center>el-input>
    13. div>
    14. div>
    15. <div class="tabel-input" v-else-if="scope.row.nameSort==5||scope.row.nameSort==6||scope.row.nameSort==8">
    16. <el-input v-model="scope.row.proAsk" center>el-input>
    17. div>
    18. <div v-else>
    19. {{scope.row.proAsk}}
    20. div>
    21. div>
    22. <div v-else>
    23. {{scope.row.proAsk}}
    24. div>
    25. template>
    26. el-table-column>

    这样写后来接手项目的人读起来会很难受,如果他继续加条件,这一块不得再加个好几十行

    改进方案:

    1. <el-table-column prop="proAsk" label="产品工艺要求" align='center'>
    2. <template slot-scope="scope">
    3. <div v-if="isSee">
    4. <div class="tabel-input" v-if="scope.row.nameSort==4">
    5. <div v-if='[1,2,3,5,6,7].includes(scope.row.classSort)'>
    6. <el-form-item :prop="'tableDatas.'+scope.$index+'.proAsk'" :rules="rules.proAsk">
    7. <el-input v-model="scope.row.proAsk" center>el-input>
    8. el-form-item>
    9. div>
    10. <div v-else>
    11. <el-input v-model="scope.row.proAsk" center>el-input>
    12. div>
    13. div>
    14. <div class="tabel-input" v-else-if="[5,6,8].includes(scope.row.nameSort)">
    15. <el-input v-model="scope.row.proAsk" center>el-input>
    16. div>
    17. <div v-else>
    18. {{scope.row.proAsk}}
    19. div>
    20. div>
    21. <div v-else>
    22. {{scope.row.proAsk}}
    23. div>
    24. template>
    25. el-table-column>

    3、模板字符串的应用

    1. if (str1.length || str2.length) {
    2. if (str1.length) { //定价单位不一致
    3. let msgStr = str1.join(',')
    4. msgStr = '第' + msgStr + '行定价单位与所关联报价不一致'
    5. this.$message.error(msgStr)
    6. return
    7. }
    8. if(str2.length){//材质校验不一致
    9. let msgStr2=str2.join(',')
    10. msgStr2='第'+msgStr2+'行材质与所关联报价不一致'
    11. this.$message.error(msgStr2)
    12. return
    13. }
    14. }

    模板字符串可以直接使用表达式,就不需要额外创建这些变量了

    改进方案:

    1. if (str1.length || str2.length) {
    2. if (str1.length) { //定价单位不一致
    3. this.$message.error(`第 ${str1.join(',')}行定价单位与所关联报价不一致`)
    4. }
    5. if(str2.length){//材质校验不一致
    6. this.$message.error(`第${str2.join(',')}行材质与所关联报价不一致`)
    7. }
    8. return
    9. }

    4、删除列表选中数据

    1. <template>
    2. <el-row>
    3. <el-col :span="24" style="height: 40px;" v-show="!isSee">
    4. <el-button size="mini" type="text" @click='addTable'>增加el-button>
    5. <el-button size="mini" type="text" @click='delTableRow'>删除el-button>
    6. <el-button size="mini" type="text" @click='selectAll'>全选el-button>
    7. <el-button size="mini" type="text" @click='delTableChose'>取消全选el-button>
    8. el-col>
    9. <el-col :span="22">
    10. <el-table ref="multipleTable" border :data="tableData" max-height='300' show-summary size='mini'
    11. tooltip-effect="dark" style="width: 100%" @selection-change="handleSelectionChange">
    12. <el-table-column type="selection" width="55" align="center" v-if="!isSee">
    13. el-table-column>
    14. <el-table-column label="行项目" width="70" align="center" fixed="left">
    15. <template slot-scope="scope">
    16. {{ scope.row.od }}
    17. template>
    18. el-table-column>
    19. <el-table-column label="产品名称" width="100" align="center" prop="productName" fixed="left">
    20. <template slot-scope="scope">
    21. <div class="tabel-input">
    22. <el-input v-model="scope.row.productName" :disabled="isSee" center placeholder="产品名称">
    23. el-input>
    24. div>
    25. template>
    26. el-table-column>
    27. <el-table-column label="材质" width="160" align="center" prop="material" fixed="left" />
    28. el-table>
    29. el-col>
    30. el-row>
    31. template>
    32. <script>
    33. export default {
    34. data() {
    35. return {
    36. choseData: [],
    37. tableData: [],
    38. isSee: false
    39. }
    40. },
    41. methods: {
    42. handleSelectionChange(arr) {
    43. this.choseData = arr
    44. },
    45. delTableChose() {
    46. this.$refs.multipleTable.clearSelection();
    47. },
    48. // 设置全选
    49. selectAll() {
    50. this.tableData.forEach((obj) => {
    51. this.$refs.multipleTable.toggleRowSelection(obj, true)
    52. })
    53. },
    54. //新增行数据
    55. addTable() {
    56. let data = {
    57. 'od': this.tableData.length + 1, //序号
    58. "addition": "",
    59. "productName": "",
    60. "material": "",
    61. }
    62. this.tableData.push(data)
    63. },
    64. // 删除行数据
    65. delTableRow() {
    66. let arr2 = this.tableData,
    67. arr1 = this.choseData
    68. for (var i = 0; i < arr2.length; i++) {
    69. for (var j = 0; j < arr1.length; j++) {
    70. if (arr2[i].od == arr1[j].od) {
    71. arr2.splice(i, 1);
    72. }
    73. }
    74. }
    75. this.tableData = arr2
    76. this.changeData()
    77. },
    78. }
    79. }
    80. script>

    这里会存在的问题是od项是自定义的数值,所以会出现多个条目od值一样的情况(删除后再添加),需要在删除之后对该数组od值重排

    改进方案:

    1. delTableRow() {
    2. let arr1 = this.tableData,
    3. arr2 = this.choseData,
    4. newArr = []
    5. // 遍历两个数组,并判断数值是否相等,如果相等,就将空字符串赋值给该数值
    6. newArr = arr1.filter(items => {
    7. if (!arr2.includes(items)) return items;
    8. })
    9. newArr.forEach((i, j) => {
    10. i.od = j + 1
    11. })
    12. this.tableData = newArr
    13. this.changeData()
    14. }

    当然了,这些技能可能原本的方式也能处理相应的业务逻辑,我给大家讲这些方案的目的是让大家学以致用,为什么面试都要问ES6,CSS3,HTML5,随着技术的不断更迭,作为技术人员的我们不说永远走在技术前沿,最起码也不能落后太多吧!

    最后总结一下,学习学习,讲的是先求学然后要习练,理论知识掌握得不论多到位,不去练习到了实际应用中还是不会。什么是学知识,那是要长年累月地磨炼,不是光会看秘籍就能成为武林高手的,正真的高手的身上全是伤,手上全是茧。所以,不管是学习还是我们的生活,其实都是一个不断练习巩固知识的过程,最终通过这些经验来面对生活和工作中随时会出现的各种问题,难的不是生活和工作,难的是如何去面对生活和工作!

  • 相关阅读:
    RK3588 rtc-hym8563设备开发
    【微服务】分布式基础概念
    表白墙案例(前端,Java,Mysql)
    92倒计时自律习惯养成计划打卡-day8
    Linux Shell编程第5章——文件的排序、合并和分割
    viple进阶4:打印空心三角形
    OP-TEE的内存和缓存管理(五):OP-TEE的共享内存和cache
    Python遥感开发之arcpy批量重采样
    Linux内存管理:memblock
    免费word转换pdf的软件
  • 原文地址:https://blog.csdn.net/tan1071923745/article/details/126699071