vue中遇到的坑

 如何解決在vue中替換圖片、一個使用base64,而咱們使用zepto以後,src找不到資源,由於已經打包了,難道強行寫base64。css

1. 引入文件時語法很重要!html

import "FooterMenu" from '@components/Menu';
import FooterMenu from '@components/Menu';

即在頁面組件中引入一個FooterMenu組件, 咱們引入時應該引入的一個變量做爲標籤,而不能再FooterMenu上添加引號!!  在這裏浪費了不少時間。vue

 

2. 在一個單頁面組件中不須要style,但必需要script。jquery

即在.vue文件中,咱們能夠沒有style,可是必需要有script來利用 exports default 來導出模塊,不然就會出錯。ios

 

補充: vuex

    <transition name="fade">
      <div class="pay-model" v-show="ifpay">
        <div class="pay-style">
          <div  v-if="payArr[payArr.length - 3] == 1">
            <input type="radio"  name="settleChoose" checked = "checked"  data-value='4' id="wechat" value="微信支付" v-model="style">  
            <label for="wechat" >微信支付</label>
          </div>
          <div v-if="payArr[payArr.length - 2] == 1">
            <input type="radio" name="settleChoose"  id="alipay" data-value='2' value="支付寶支付" v-model='style'>  
            <label for="alipay"  >支付寶支付</label>
          </div>
          <div  v-if="payArr[payArr.length - 1] == 1">
            <input type="radio" name="settleChoose" id="tohome" data-value='1' value="貨到付款" v-model='style'>  
            <label for="tohome">貨到付款</label>
          </div>
        </div>
      </div>
    </transition>

在這裏,若是style的值爲初始值 "", 即爲空,那麼咱們及時使用這裏的checked = "checked"也沒法自動選中,解決方法:若是咱們但願在打開模態框以後的微信支付是默認的,那麼咱們就能夠將 style 的初始值設置爲 「微信支付」, 這樣就沒有什麼問題了。vue-cli

 

 

補充:express

      <div v-if="payArr[payArr.length - 2] == 1">
                <label class="pay-lable" >
                <input type="radio" v-bind:checked = 'curPayMethod == 2' name="choosePay" value="2">  
                支付寶支付</label>
              </div>
              <div  v-if="payArr[payArr.length - 3] == 1">
                <label class="pay-lable" >
                <input type="radio" v-bind:checked = 'curPayMethod == 4' name="choosePay" value="4">  
                微信支付</label>
              </div>
              <div  v-if="payArr[payArr.length - 1] == 1">
                <label class="pay-lable">
                <input type="radio" v-bind:checked = 'curPayMethod == 1' name="choosePay" value="1">  
                修改成貨到付款</label>
              </div>

 

label的for對應於input的id,若是說不能正常使用,其實咱們也能夠直接將input寫進label裏去,這樣會更加方便,再也不須要使用 for 和 id 了。npm

 

 

 

 

 

3. 當咱們在路由中配置了不一樣的router-link對應於不一樣的組件的時候,會發現npm run dev以後什麼都沒有,好比個人路由以下:axios

export default new Router({
  routes: [
    {
      path: '/Mall',
      component: Mall
    },
    {
      path: '/personal-center',
      component: personalCenter
    }, 
    {
      path: '/order',
      component: AlipayHint
    },
    {
      path: '/commodity',
      component: Commodity
    }
  ]
});

運行以後,是空白頁,這是由於路由中並無配置一進來是「/」的路由,因此什麼都沒有顯示,這時就須要重定向了。以下所示:

routes: [
    {
      path: '/Mall',
      component: Mall
    },
    {
      path: '/personal-center',
      component: personalCenter
    }, 
    {
      path: '/order',
      component: AlipayHint
    },
    {
      path: '/commodity',
      component: Commodity
    },
    {
      path: "/",
      redirect: "/commodity"
    }
  ]

即咱們須要重定向的時path中的值,而不是component中的值。

 

 

4. 在v-for下的列表中,如何向方法傳遞參數?  

(1) 咱們能夠在一個list中綁定 v-for="item,index in items", 這樣,咱們就能夠獲取到相應的item和index(從0開始),另外,若是咱們但願向list中的某個v-on:click = "handler" 傳遞參數,能夠直接傳遞,好比: v-on:click="handler(index)", 這樣就能夠向methods下的handler傳遞參數了。

(2) 咱們還能夠傳遞$event直接給hanlder,而後經過e.currentTarget獲取到這個元素。 

 

 

5. 如何使用vuex、使用store中的數據、替換store中的數據?

  vuex你們都不陌生,好比我在一個store的state中存儲了items爲一個空數組,而後在組件中循環數組中的每個元素並展現出來,而後再經過axios獲取到數據以後更新store,這樣數組中就有元素了。

  最開始我使用的思路以下所示:

const state = {
  totalPrice:  0,
  items: [],
 //.... 其餘的state }

 

  而後經過axois獲取items,獲取到以後更新:

  .then(function (response) {
    if (response.data.code == 130) {
      items = response.data.data;
      console.log(items);
      store.commit('update', items);
    }

  其中的update已經在mutation中定義了,由於咱們知道vue中的state只能經過commit這一種方式來替換而不能經過其餘方式,以下:

mutations: {
update (state, items) {
state.items = items;
}
}

 

   最後,咱們須要把items掛載到組件下:

  data: function () {
      return {
        name: "CommodityKinds",
     items: this.$store.state.items } },

 

  說明:由於我已經將store註冊到根組件下了,因此咱們能夠在組件中使用 this.$store.state來訪問到state對象。 

  可是,這樣是有問題的 --- 咱們會發現,進入有items數據的頁面後, 數據並無被渲染出來,而是等到咱們切換頁面,再切換回來的時候才能渲染出來。

  而問題就出如今了最後一步!  

  咱們應該將store中的數據放在computed下而不是放在data下!!!!

  具體解決方法以下:

  import {mapState} from 'vuex'

  而後:

    computed: mapState({
      items: state => state.items
    })

  這樣,當store中的數據改變時, 就會直接改變了,更多例子能夠看vuex官方文檔,講的很好。 

總結: 通常而言,咱們須要將store下的state放在computed中,將組件自身的state,不須要像vuex這樣動態的、傳遞的放在 data 下便可。

 

 

 

6. 在vue中,咱們可使用v-on:click.once對click處理函數只綁定一次,這樣就相似於jquery中的one綁定了。  

 

 

7. 在jquery中,若是咱們但願第一個元素最開始添加一個active類名,咱們可使用class綁定,其中是一個對象,對象中的屬性是類的名稱,值是布爾值,若是爲true,則顯示,不然不顯示。 

<template>
  <div class="commodity-kind">
    <div class="kind" v-bind:class="{active: index == 0}" v-on:click="getContent(item.id, $event)" v-for="item,index in items">
      <span>{{item.name}}</span>
    </div>
  </div>
</template>

 

  這樣,一進去就是這樣的狀態了。

 

 

 

8. 當須要axios請求時,若是咱們在不一樣的組件中都須要請求,而且都有相同的請求頭,特別是最近的項目我須要使用vue-cli的express代理Tomcat服務器進行測試開發時,就要添加/api才能正常訪問,可是在每個請求前添加這個是很是麻煩的,而且在 npm run build 時,又要把這些/api去掉,這是至關麻煩的,因此咱們能夠單獨創建一個js文件,我命名爲 request.js 文件,內容以下:

import axios from 'axios'
axios.defaults.baseURL = "/api";
axios.defaults.headers.common['BBG-Key'] = "ab9ef20253-49d4-b229-3cc2383480a6";


export default axios

 

其中,/api是在開發過程須要代理服務器所必須的, 因此這裏設置爲baseURL,那麼在實際請求中,就會自動添加/api, 而且在實際生產中,咱們只要註釋掉它就能夠了。 

而BBG-Key是爲了安全使用的,因此爲了不每次在請求時都添加一個請求頭,咱們在這裏直接設置爲 common(公共) 的請求頭。這樣,在實際的每個請求中就不須要都添加這個請求頭了。 

最後導出這個 axios,在其餘的模塊中引用。

import axios from '../assets/js/request'
  axios.get('/bbg/shop/get_classify', {
    params: {
      sid:  13729792
    } 
  })
  .then(function (response) {
    if (response.data.code == 130) {
      items = response.data.data;
 //............

 

這樣,就會較以前省去不少的工做量。 good!

 

9. vue中在css下寫的,即通常使用的時做爲背景圖的,在assets下的圖片通過打包以後使用的時base64的編碼方式,因此,若是在js中操做css,使用路徑的方式是行不通的,個人方式是使用base64, 可是有更好的方法嗎?以下所示:

 handleDefault (id,e) {
        $(".default").html("設爲默認").css({
          'color': 'black',
          'background': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAC+SURBVFhH7Y5BCgIxDEXHs7h15wV0XWjajeD9D6IVP8wfJlAITovwH2QTEt5bxFGY2W3kQNun1vqaOcjw8R5mDHL2eMczBjlbSinP7tGBsLu1nLFeacsHH2E9DHa3livWKwrswG4FRmC3AiOwW4ER2K3ACOxWYAR2KzACuxUYgd0KjMBuBUZgtwIjsFuBEdj9n4FmVvgI62GwO6V0wXoLH80c5OzxjmcMcny8h5GDjC6nnPN95HycX7X4JcvyBq2MUQCYxq1GAAAAAElFTkSuQmCC) no-repeat',
          'background-size': '0.4rem'
        });

         $(e.currentTarget).html("默認地址").css({
          'color': '#51B1B0',
          'background': 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAnCAYAAAB9qAq4AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAG3SURBVFhH7Zc9S8NgFIXrFwiuiuDu4uoPcFFwEJsUhP6COjk7+hscO7h0a5Hc+6bOdnMRHMTByV1wEB0caxJPX0xzY9MkvSLmgQekOSfvoWlFaxUaHPV6C/vd7lqZHvj+Km6fj71OZ8U1PNTQYXrCsdlwjTmRbjRrz4bDeUxI55B5SypriRnpSCVN60wPmJKkacy6VNIWc5I45J1LBW0xJ4nLxFJB2+12ewmT4lQDM1oNTJXpBkeFv878xHX4KwMdY+5wTESDeVfKhaoPdAzf4wiLlBupOtAxdIvbj5iTct9VG+gQXePWFik3bqGBiE48qG7oClGLlJPMPbDJvIFohJQJDR6rQcQi5dLMPTD4sL8iaklkyPNwyTKemWSxzyDzC+IWe42I8ZIl1s1o8S8JeW+oWFyf+/jRInYzWHxgYPC431ETkTpZLWVgaN3wM6oxpOw0ljYwcuw/MjEzpeUO/PLD9elYeD2XsxhYqn93oMNMUkHbncFgEZPiNAy1pIK2mJOkFby1UkFbzJGRCrrSBabIBM9/WS7qiBk/0+hfbkrlWYvjsxP8Xfco3ah0iU5xZMV/o1b7BPkQ+pZZ2s/xAAAAAElFTkSuQmCC) no-repeat',
          'background-size': '0.4rem'
         });

 

 

 

10. class綁定的是一個對象,通常狀況下,這個對象直接定義在html中是比較好處理的,以下:

   <!-- 這裏使用class綁定來決定默認 -->
            <span class="no-default" v-bind:class="{default: item.id == defaultAddress.id}" v-on:click="handleDefault(item.id, $event)" >
              {{ (item.id == defaultAddress.id) ? "默認地址" : "設爲默認" }}
            </span>

注意: class中的class名稱不能用引號括起來。 

 

 

 

 

11. 在menu中,每當點擊一個選項時,替換其背景圖片,如何作到實時的變化。 

最開始,個人實現思路是: 先經過import的方式引入,而後在 v-for 中引用data下的每個項目的src, 而後當點擊選項的時候, 用switch函數來根據點擊的index來進行替換圖片,可是這樣的替換存在一個問題: 每當點擊以後,第一次並沒變化,而是再點擊一次,纔會發生改變。

緣由: 在vue中,data下的值和DOM中不是實時更新的,因此通常實時更新就要使用store。 即在store中import 圖片資源,而後在改變的時候經過mutations進行改變。 這樣的變化就是實時的了。 

問題: 雖然使用 mutations 能夠實時改變,但問題是,咱們徹底是沒有必要的,由於這個改變只須要在一個組件中,使用store未免過小題大作了。

注意:這裏使用的是vue的data,而且須要改變的時引入的文件(須要打包的),對於下面這樣只須要修改顏色的不須要使用這樣的方式, 只須要使用 zepto 來改變css便可,這樣必定是實時的。

 

 

 

12. 使用actions時,須要commit Mutations,可是actions 不支持多參數傳遞,也就是說第一個參數是Mutation,第二個參數是咱們須要傳遞的值,若是傳入多個,那麼第三個及之後將自動忽略,爲了解決這個問題,咱們能夠將多個值封裝到一個對象,而後傳遞這個對象就能夠了,這就相似於Payload啊啊啊。

       if (response.data.code == 626) {
              for (let i = 0; i < response.data.data.length; i++) {
                console.log(response.data.data[i], index);
                var obj = {
                  index: index,
                  item: response.data.data[i]
                };
                commit(UPDATE_ALL_CONTENT, obj);

              }
              index++;
              resolve();
            }

 

OK! 這就是payload。 哈哈哈哈 理解就好。

 

 

13. 在vue中,咱們傳入的事件必定是$event,可是獲取時, e.currentTarget 和 e.target 獲取的不同的,區別在於 前者是當前的元素,即冒泡的最後一個綁定事件的元素,然後者是 最原始的元素。 

關鍵: 後者能夠實現事件代理。

 

 

 

 

14. 有時候啊, 一個很小的錯誤都會致使全局的失敗! 好比,不知道爲何就報下面這種錯誤! 

 

 

而後內容就顯示不出來,可是經過network能夠獲知數據都請求到了,因此遇到這種問題個人解決方法仍是尋找於此有關的代碼,而後逐個註釋代碼,若是註釋以後再也不出錯,就說明問題出在了這裏,經過尋找,問題在這:

<template>
  <div class="item"}>

 

即以前添加屬性時, } 沒有去掉。  

 

雖然有問題了,可是解決問題的方法和思路正確就好。

 

 

 

 

15. 爲何document.body.scrollTop = 0 不生效,而 document.querySelector("body").scrollTop = 0; 是能夠的呢?

 

 

 

 

 16. 下面的這個錯誤而很明顯!  就是在建立鉤子函數created中出現了未定義的變量:

Error in created hook!

 

 

17. localStorage沒法輸出

爲何只有localStorage能夠輸出,而其餘的不能呢? 就是訪問不到屬性!

相關文章
相關標籤/搜索