vue项目问题记录

242 阅读2分钟

1、vue项目加载本地json文件

方法一

前期联调没有后台数据的情况下,加载本地json数据

1、创建json文件 src/mock/applist.js

module.exports ={"data":
	//json
}

2、引用 import applist from ‘@/mock/applist.js’ // 引入

data(){
      return{
        isMock:1,//1伪数据
       }
    if(this.isMock == 1){
	let res = applist
        console.log(res )
      }else{
        this.getUserListAll();  //掉接口
      }

2、 弹框组件引用

1、 页面引用

<template>
<!-- 确认单申请 -->
  <div class="supplierlist-wrap wrapper">
  <!-- 详情弹窗 -->
    <el-dialog
      custom-class="supplier-detail-box"
      :visible.sync="dialog_visible"
       v-if="dialog_visible"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
      :destroy-on-close="true"
      width="80%"
      top="15vh">
       <cfmApplyAdd  :deatilData="deatilData" @close="detailDialog" @success="successDialog" />
      </el-dialog>
  </div>
  </template>

2、import引入

import cfmApplyAdd from './cfmapply/CfmApplyAdd'

3、components中写入子组件

 components: {
     cfmApplyAdd,
    },

4、新建CfmApplyAdd.vue文件

3、 v-for渲染数据一行多列

i%2==0是template数据,里面的用数组[i+1]就可以得到值

 <div id="app">
        <table>
            <template v-for='(item,i) in expertArr' v-if='i%2==0'>
                <tr>
                    <td>
                        <div class="col">
                            {{item.name}}
                        </div>
                    </td>
                    <td v-if='i+1<expertArr.length'>
                        <div class="col pl">
                            {{expertArr[i+1].name}}
                        </div>
                    </td>
                </tr>
            </template>
        </table>
    </div>
 data: {
            expertArr:[
                {"id":01,"name":"吴安杰-1"}, 
                {"id":02,"name":"吴安杰-2"},
                {"id":03,"name":"吴安杰-3"},
                {"id":04,"name":"吴安杰-4"},
                {"id":05,"name":"吴安杰-5"}]
        }

4、Vue elementui 多张图为一组轮播展示

let res1 = [
     { src: "001", title: "标题1" },
     { src: "002", title: "标题2", },
     { src: "003", title: "标题3", },
     { src: "004", title: "标题4", },
     { src: "005", title: "标题5", },
     { src: "006", title: "标题6", },
   ]

   let res2 = [
     {
       imgs: [
         { src: "001", title: "标题1" },
         { src: "002", title: "标题2", },
         { src: "003", title: "标题3", },
         { src: "004", title: "标题4", }
       ],
     },
     {
       imgs: [
         { src: "005", title: "标题5", },
         { src: "006", title: "标题6", }
       ]
     }
   ]
// res1改造成res2数组,轮播图遍历res2.imgs
// arr 原数组 n几张为1组
   function groupByNum(arr, n) {
     var newArr = [];
     arr.forEach((v, i) => {
       if (i % n === 0) {
         newArr.push({ imgs: [] });
       }
       newArr[newArr.length - 1]['imgs'].push(v);
     });
     return res2;
   }
    console.log(JSON.stringify(groupByNum(res1, 4)))
    //[{"imgs":[{"src":"001","title":"标题1"},{"src":"002","title":"标题2"},{"src":"003","title":"标题3"},{"src":"004","title":"标题4"}]},{"imgs":[{"src":"005","title":"标题5"},{"src":"006","title":"标题6"}]}]
    // vue templete 代码
    <el-carousel-item v-for="(obj,index) in expertArr">
       <el-col v-for="(item,i) in obj.imgs"/>
   ```
# 5、Tabs 标签页动态绑定:label
```js
//Tabs 标签页动态绑定label
<el-tabs v-model="activeName" @tab-click="handleClick">
   <el-tab-pane label="待预定" name="first">
   </el-tab-pane>
   <el-tab-pane label="待取消" name="second">
   </el-tab-pane>
   <el-tab-pane label="待离店" name="third">
   </el-tab-pane>
 </el-tabs>
 // 页面
     <el-tab-pane name="first">
       <template slot="label">
         待预定<span class="cored">({{statusCount.waitBookingCount}})</span>
       </template>
     </el-tab-pane>
     // data
      statusCount: {
       waitBookingCount: '',
       waitCancelCount: '',
       waitAdvanceCheckOutCount: ''
     },
     // 方法
   getStatusCount () {
     // 待预定(66)  待取消(70) 待商店(88)
     setTimeout(() => {
       let res = {
         'waitBookingCount': '50',
         'waitCancelCount': '60',
         'waitAdvanceCheckOutCount': '100'
       }       
       this.statusCount = res
     }, 100);
   },      

6、attrs和listeners

    v-bind="$attrs"  //将A组件的数据传递给C组件 
    v-on="$listeners"
//$listeners 属性,我们在b组件上 绑定 v-on=”$listeners”, 在a组件中,监听c组件触发的事件。就能把c组件发出的数据,传递给a组件

调用强制更新方法this.$forceUpdate()会更新视图和数据,触发updated生命周期。

7、vue强制更新$forceUpdate()

  添加this.$forceUpdate();进行强制渲染,效果实现。搜索资料得出结果:因为数据层次太多,render函数没有自动更新,需手动强制刷新。
  调用强制更新方法this.$forceUpdate()会更新视图和数据,触发updated生命周期。

8、vant下拉组件点击循环处理关闭

     <van-dropdown-item :title="`筛选${index}`"
                          :ref="`item${index}`"
                          v-for="(item,index) in 3"
                          :key="index">
         <van-cell center
                   :title="`包${index}邮`">
           <template #right-icon>
             <van-switch v-model="switch1"
                         size="24"
                         active-color="#ee0a24" />
           </template>
         </van-cell>
         <div style="padding: 5px 16px;">
           <van-button type="danger"
                       block
                       round
                       @click="onConfirm(index)">
             确认{{index}}
           </van-button>
         </div>
       </van-dropdown-item>
     </van-dropdown-menu>
 onConfirm (index) {    
     this.$refs[`item${index}`][0].toggle()
   },

ref的值变成活动,因为是for循环 :ref="item${index}",click事件传值index过去,下面接收处理 this.refs[itemrefs[`item{index}`][0].toggle(),这个地方是重点,主要还是之前不明确ref的值,

image.png

总结: 1、v-for的时候:ref应该是变量 2、对真正定位到ref的状态不清楚,是一个VueComponent{}对象

9、可以使用this.$set()来进行强制更新,进而解决问题

 对象操作:

 三个参数:this.$set("改变的对象","改变的对象属性","值")

 数组操作:

  三个参数:this.$set("数组","下标","值")

对数据整体进行操作:

三个参数:this.$set(this,"要更新的数据名","更改的数据")