1. 程式人生 > >vue踩坑之旅

vue踩坑之旅

1.vue專案外部js(es5,es6),css檔案的引入;
  方法一:
      在index.html通過script ,link標籤引入,要將檔案先放入static資料夾(靜態資源)下, 注意不能放src下
  方法二:
      如果是es6,參照export和import來引入;
      css檔案如果放在src資料夾下,(App.vue或src其他檔案下)@import './assets/css/bootstrap.css';

2.如果在index.html中引入layer,

//info是data(){return {info: 'layer-vue'}}
layer.confirm('修改info:<input v-model="info">', { 
                     btn: ['確定','取消'] 
                    }, function(){
                       layer.msg('重要', {icon: 1});
                    }
                });

    問題:觸發的彈框彈出時,生成的input標籤的v-model = "info"是無效的,因為此時已經過了vue的生命週期;

    解決方法:npm install vue-layer

3.在index.html頁面中引入的外部js外掛 plugins/My97DatePicker4.8/WdatePicker.js

<input onClick="WdatePicker()" v-model="beginTime"/>  //繫結不了值

   問題:外部js外掛,繫結不了值  

   解決方法:用其他時間外掛 或者 用h5的新特性date <input type="date"  v-model="beginTime"/>

4.vuex 的store.js中的mutations:mutations中只能是資料管理,不能有頁面操作;然後mutations中方法的引數不能超過2個
   問題:傳入的值會變成undefined,就不能正常操作store。

 mutations:{
     addList (state, value){ //這裡的state直接指向store.js裡的state ; 注意:引數不能超過2個
               state.lists.unshift(value)
         }
   }

5.vuex的store資料 與 元件裡的data 和 v-model的繫結問題(修改頁面未點選確定修改,輸入的資料已經寫入到store裡面 :input的輸入改變,直接導致this.$store.state.param改變
                   
   問題程式碼如下:

 <template>
     <input type="text" v-model="param"/>  <!--雙向繫結到data中的param-->
 </template>


  export default {
      name: 'List',
      data () {
          return {
              param: this.$store.state.param
          }
      }
   }

    解決方法:可以$store.state.param是物件採用深拷貝 ,普通變數直接賦值,不然存入store中的是data中的引用地址             

   let paramNow = this.$store.state.param ;

   data () {
         return {
            param: paramNow   //所以此時v-model雙向繫結的就是paramNow ,不再對store進行操作
         }
   }


6.vue中html屬性繫結值v-bind,遍歷寫在input 的value中沒有解析出正確的值(不能使用{{}} 雙大括號來繫結屬性值)         

<label v-for="(item, index) in skillList" :key="index"> 
<!--value="item.skillName"賦值只是個字串-->
<input type="radio" class="skill" value="item.skillName" v-model="hobbylist.skill"/>
</label>

   解決方法:v-bind:value=item.skillName

<label v-for="(item, index) in skillList" :key="index">
    <!--v-bind:value=item.skillName"-->
    <input type="radio" v-bind:value=item.skillName" v-model="hobbylist.skill"/>
</label>

     說明:v-model 繫結的值通常是靜態字串 ;把值繫結到 Vue 例項的一個動態屬性上,這時可以用 v-bind
7.vue路由問題
   router/index.js的路徑配置

 
    {
      path: '/',   //一定要把這個配置寫上
      component: Home
    },
    {
      path: '/staffList',
      name: 'StaffList',
      component: StaffList
    }
  <li v-for = "(item ,index) in lists" :key = "index">
     <router-link :to="{path:'/detailStaff', query:item}" v-on:click="setIndex(index)"> 
     </router-link>
  </li>  
<!-- (router-link :to) to加冒號是表示式(不能太複雜),沒加就是普通字串-->
<!--注意{path:'/detailStaff', query:item}一定是query 不能改-->
<!--params、query不設定也可以傳參,但是params不設定的時候,重新整理頁面或者返回引數會丟失,query並
不會出現這種情況-->

8.vue的核心思想:漸進式的javaScript框架,資料驅動檢視(所以用data中的資料去構成dom,不用js或jquery去操作dom


9.this.$store.commit傳參的問題: value的值 data(){return { info : {name:'youyou'} }}不能是地址引用(也不能是物件的淺拷貝)

  問題:this.$store.commit('addList' , this.info);此時store儲存的資料是this.info的引用地址,當info v-model繫結時,修改了       this.info,store裡的值由於引用地址的原因同時也被修改 ;
 解決方法:傳值的時候最好不傳引用 ,拷貝一份資料,傳過去;
 深拷貝的方法(淺拷貝的還是地址引用):
              JSON.parse(JSON.stringify( this.info ))    //轉化為字串基本型別,直接賦值拷貝
              $.extend(true, {}, this.info))     //jquery的方法
           Object.assign()     //es6的方法,但是隻能拷貝一層(淺拷貝){ name :'youyou'} ;如果是兩層以上{ user: { name :'youyou'}}就不行,需要自己寫方法遍歷一層一層判斷賦值