1. 程式人生 > 其它 >個人自學前端24-Vue1-插值表示式,Vue例項,Vue指令,API

個人自學前端24-Vue1-插值表示式,Vue例項,Vue指令,API

目錄

Vue基礎

Vue和React => 檢視框架 => 不通過DOM操作更新頁面(檢視)

渲染檢視
1:DOM操作
2:資料驅動(沒有DOM操作) => 給標籤繫結資料,要修改標籤,直接修改與之繫結的資料即可.(沒有DOM操作).

一. 插值表示式

插值表示式是vue框架提供的一種在html模板中繫結資料的方式,使用{{變數名}}方式繫結Vue例項中data中的資料變數。會將繫結的資料實時的顯示出來。

{{插值表示式}} => 可以寫任意的js表示式
插值表示式內的資料或者方法都應該vm例項的屬性或者方法.
alert不是Vm例項的方法,因此會報錯.

二. Vue例項

    // vm就是一個Vue例項
    let vm = new Vue({
      // 確定檢視範圍.app內部所有的後代元素都可以繫結資料
      // el的值是選擇器.如果選擇器匹配多個元素,則只有第一個生效.
      // 不能設定body和html這樣的特殊標籤作為檢視.
      el: '#app',
      // data內的資料都會變成Vue例項的屬性.
      data: {
        msg: '冪冪',
        str: '你好嗎'
      },
      // vm例項的方法都寫在methods中.
      methods: {
        alert() {
          window.alert(10000);
          return 'alert'
        }
      }
    });

render選項 => 代替template選項
render選項也是為了確定元件檢視.
template => 字串檢視 => 優點是直觀.缺點是需要編譯.
render => 跳過編譯字串template,直接生成虛擬節點 => 優點是效能好,不用編譯,確定是模板不直觀

    const App = {
      // template: `
      //   <div id='app'>
      //     <h3>App元件</h3>
      //   </div>
      // `,
      // 直接通過render函式生成虛擬節點.
      // createElement(標籤名, 屬性列表, 子節點列表)
      // createElement(元件配置項)
      render(createElement) {
        return createElement('div', { attrs: { id: 'app' } }, [
          createElement('h3', null, 'App元件')
        ]);
      }
    }
    new Vue({
      // el: '#app',
      // template: '<App />',

      // render(h) {
      //   return h(App)
      // },
      render: h => h(App),
    }).$mount('#app');

三. Vue指令

1.v-vind

v-bind:屬性名 => 指令 => 讓標籤的屬性繫結一個Vue資料
v-bind:的簡寫是:(冒號)

指令的值可以是任意表達式.意即把表示式的返回值繫結到指定是屬性上.

v-bind繫結class有特殊寫法:
1:指令值繫結陣列.
2:指令值繫結物件.

如果class綁定了多個類.則如何新增一個類,刪除一個類?
不能用以下的方法實現了。
classList.add,
classList.remove.
假設繫結的是cn,則應該通過修改cn來新增或者刪除類.

<body>
  <div id='app'>
    <h3 :class='cn'>{{msg}}</h3>
    <h3 :class='cnList'>{{msg}}</h3>
    <h3 :class="['box', 'active', 'nav']">{{msg}}</h3>
    <h3 :class="obj">{{msg}}</h3>
    <h3 :class="{'box': true,'active': true,'nav': false}">{{msg}}</h3>
    <h3 :class="{'box': true,'active': cnList.length === 3,'nav': false}">{{msg}}</h3>
  </div>
  <script src="js/vue.js"></script>
  <script>
    let vm = new Vue({
      el: '#app',
      data: {
        msg: 'Vue!!!',
        cn: 'box active nav',
        cnList: ['box', 'active', 'nav'],
        obj: {
          'box': true,
          'active': true,
          'nav': false
        }
      }
    })
  </script>
</body>

繫結style屬性,還可以寫成物件的形式.

<body>
  <div id='app'>
    <div :style='sty'>999999</div>
    <div :style='obj'>999999</div>
    <div :style='{width: "100px", heigth: "100px", backgroundColor: "red"}'>999999</div>
    <div :style='{width: "100px", height: "100px", backgroundColor: color}'>999999</div>
  </div>

  <script src="js/vue.js"></script>
  <script>
    // 繫結style屬性,還可以寫成物件的形式.
    let vm = new Vue({
      el: '#app',
      data: {
        color: 'red',
        sty:'width: 100px; height: 100px; background-color: red',
        obj: {
          width: '100px',
          height: '200px',
          backgroundColor: 'red',
        }
      }
    })
  </script>
</body>

2.v-on

v-on:事件名 => 指令 => 用來給元素新增事件
v-on的簡寫 => @
v-on事件傳參,直接在指令後寫函式呼叫.
v-on使用事件物件.
1:沒引數 => 直接通過形參獲取.
2:有引數 => 需要手動傳入$event

事件控制代碼內的this預設永遠指向當前的vm例項.

  • @click.stop => 修飾符.阻止冒泡
  • @click.prevent => 修飾符.阻止預設事件
  • @click.prevent.stop => 修飾符.阻止預設事件和冒泡

3.v-if

v-if => 條件渲染 => 顯示隱藏 => 指令值是布林值. true表示顯示,false表示隱藏
v-if 和 v-show功能一致.(區別要學到虛擬節點)
v-show 其實是通過display樣式來控制顯示隱藏的。

v-if 和 v-else-if 和 v-else 指令可以配合使用.

<body>
  <div id='app'>
    <button @click='fn'>按鈕</button>
    <div v-if='flag'>111111111111111</div>
    <div v-show='flag'>111111111111111</div>

    <h3 v-if='1>2'>111</h3>
    <h3 v-else-if='1<2'>222</h3>
    <h3 v-else>333</h3>
  </div>
  <script src="js/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      data: {
        flag: true,
      },
      methods: {
        fn() {
          this.flag = !this.flag
        }
      }
    })
  </script>
</body>

4.v-for

列表渲染
記得v-for都要加key.
資料的更新和檢視的更新保持一致.(例如位置).需要加key
還得保證更新前後的key是不一樣的。

<body>
  <div id='app'>
    <ul v-for='val in list'>
      <li v-for='item in val'>{{item}}</li>
    </ul>
  </div>
  <script src="js/vue.js"></script>
  <script>
    // 子v-for可以獲取父v-for的臨時變數。
    // 兄弟元素無法共享v-for的臨時變數.
    new Vue({
      el: "#app",
      data: {
        list: {
          arr1: [444, 555, 666],
          arr2: [111, 222, 333]
        }
      }
    });
  </script>
</body>

特殊

<div id='app'>
     // 顯示1,2,3
    <ul>
      <li v-for='item in 3'>{{item}}</li>
    </ul>
    // 顯示a,b,c,d
    <ul>
      <li v-for='item in "abcd"'>{{item}}</li>
    </ul>
  </div>

5.運算元組

<body>
  <div id='app'>
    <ul>
      <button @click='fn'>按鈕</button>
      <li v-for='(item, i) in arr'>
        {{item}}
      </li>
    </ul>
  </div>
  <script src="js/vue.js"></script>
  <script>
    // 用框架經常遇到的問題: 資料變了檢視不變.
    new Vue({
      el: '#app',
      data: {
        arr: [111,222,{name: '冪冪'}]
      },
      methods: {
        fn() {
          // 直接修改陣列元素,如果這個元素是基本型別.則檢視是不會改變的.
          // this.arr[0] = Math.random();
          // 修改應用型別,可以驅動檢視更新
          // this.arr[2].name = '超越';
          // 直接修改第三個陣列的元素變成一個新的物件,檢視不會改變.
          // this.arr[2] = {name: '超越'};
          // 直接修改length檢視也不會改變.
          // this.arr.length = 0;
          // push,pop,shift,unshift,splice,sort,reverse => 這7個方法修改陣列可以驅動檢視更新
          this.arr.splice(0,1,Math.random());
          // console.log(this.arr);
        }
      }
    })
  </script>
</body>

6.v-model

v-model => 只用在表單元素上 => 用於實現雙向繫結.
雙向: 資料變,檢視變,檢視變,資料也變.

v-model實際上是下面兩個操作的語法糖.

  1. :value='msg' => 資料變,檢視也跟著變
  2. @input='setMsg' => 檢視變,資料也跟著變.
    <input type="text" :value='msg' @change='setMsg'>
  • v-model.lazy => change事件觸發時才會修改vue資料.(輸入完成之後,再修改vue資料msg)

6.1 複選框

<body>
  <div id='app'>
    <h3>選擇你喜歡的水果</h3>
    <hr>
    <input type="checkbox" value='蘋果' v-model='favo'>蘋果
    <input type="checkbox" value='香蕉' v-model='favo'>香蕉
    <input type="checkbox" value='雪梨' v-model='favo'>雪梨
    <hr>
    你喜歡的水果:{{favo.join()}}
  </div>
  <script src="js/vue.js"></script>
  <script>
    // 繫結陣列後,複選框如果是打鉤的,則它的value會自動放入繫結的陣列.
    // 繫結陣列後,複選框如果是不打鉤的,則它的value會自動從陣列內刪除.
    new Vue({
      el: '#app',
      data: {
        favo: ['香蕉', '雪梨']
      }
    })
  </script>
</body>
<body>
  <div id='app'>
    <input type="checkbox" v-model='flag'>切換
    <div v-if='flag'>111111111111111</div>
  </div>
  <script src="js/vue.js"></script>
  <script>
    // 如果複選框繫結的是一個布林值.則複選框打鉤,這個布林值會自動變成true,不打鉤則會預設變成false
    new Vue({
      el: '#app',
      data: {
        flag: false,
      }
    })
  </script>
</body>

6.2單選框

<body>
  <div id='app'>
    <h3>選擇你的性別</h3>
    <hr>
    <input type="radio" value='男' v-model='sex'>男
    <input type="radio" value='女' v-model='sex'>女
    <hr>
    你的性別是:{{sex}}
  </div>
  <script src="js/vue.js"></script>
  <script>
    // 多個單選框繫結同一個資料,則這些單選框就只有一個是可以打鉤的.(name的作用)
    // 打鉤的選項卡,它的value就會變成當前繫結資料的值.
    new Vue({
      el: '#app',
      data: {
        sex: '女'
      }
    })
  </script>
</body>

6.3下拉框和文字域

<body>
  <div id='app'>
    請選擇你的出生年份:
    <select v-model='year'>
      <option>1997</option>
      <option>1998</option>
      <option>1999</option>
      <option>2000</option>
    </select>
    <div>你的出生年份是:{{year}}</div>
    <textarea v-model='msg' cols="30" rows="10"></textarea>
    <div>{{msg}}</div>
  </div>
  <script src="js/vue.js"></script>
  <script>
    // v-model應該用在select標籤上
    // 選中的option的內容會自動變成繫結的資料值
    new Vue({
      el: '#app',
      data: {
        year: '1999',
        msg: 111
      }
    })
  </script>
</body>

7.v-once

v-once => 檢視只更新一次,後續繫結的資料變化,不會更新當前的檢視
v-once沒有指令的值.

8.v-html,v-text

v-html => 可以用於實現插入一個標籤. => 它有安全問題.容易手動xss攻擊.=> 必須保證內容是安全的
xss => 腳步注入攻擊.
v-text => 根插值表示式的功能一模一樣

9.v-pre,v-cloak

v-pre => 讓插值表示式不會求值
v-cloak => 為了cdn引入Vue的使用者準備的.

四. API

1. $forceUpdate()

強制更新當前元件.(應急性api,不推薦濫用).

2. $children,$parent

$parent => 當前元件的父元件.(應急性api)
$children[0] => 當前父元件的子元件.(是一個數組)(應急api)

3. $refs

refs => 用來獲取檢視標籤的。
如果給元件添加了ref,則可以通過這個ref獲取到指定的元件.
$refs屬性只能在mounted中獲取.

五. 其他

1. v-if和v-show的區別

v-if => 根據初始條件決定是否把對應的標籤編譯到虛擬節點中.
v-show => 不管初始條件是什麼,都編譯標籤到虛擬節點中,渲染時,根據初始條件決定樣式display的值.

對於多次顯示隱藏的標籤,應該用v-show.
對於只有一次顯示隱藏的情況,就應該用v-if.

2. v-for和v-if的優先順序

v-for優先順序更高 => 不管有沒有虛擬節點,都會迴圈 => 效能不好.不推薦v-for和v-if一起使用.
可以通過計算屬性來過濾原始陣列,只留下應該渲染的元素.

<body>
  <div id='app'>
   <ul>
      <li v-for='d in arr' v-if='d%2 === 0'>{{d}}</li>
   </ul>
   <ul>
     <li v-for='d in arr.filter(item => item%2 === 0)'>{{d}}</li>
   </ul>
   <ul>
     <li v-for='d in list'>{{d}}</li>
   </ul>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        arr: [111, 222, 333, 444]
      },
      computed: {
        list() {
          return this.arr.filter(item => item%2 === 0)
        }
      }
    })
  </script>
</body>