Vue----class與style綁定,事件的綁定,事件相關的處理


class與style綁定

  • class 綁定

對象

<!DOCTYPE html><html lang="en"><head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>class綁定</title>
  <style>
    .coloractive {
      color: red;
    }
    .bgactive {
      background-color: green;
    }
    .box {
      width: 150px;
      height: 150px;
      background-color: #f66;
      position: relative;
    }
    .active {
      position: absolute;
      top: 3px;
      left: 3px;
    }
  </style>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body>
  <div id="app">
    <div class="coloractive bgactive">樣式的寫法</div>
    <div class="coloractive" :class="{ bgactive: flag}">class對象的綁定</div>
    <div class="box" v-for="item of list">
      <div :class="{ active: item.flag }">{{ item.msg }}</div>
    </div>
  </div></body><script>
  // 如果樣式的名稱是后端給你提供的class的名字,前端不能直接寫,此時就可以使用class綁定
  // 場景: 產品列表中的 hot 、 秒殺、....,后端會給你傳遞一個標識,前端可以依據這個標識搞事情
  // class 綁定有兩種形式
  // 對象
  new Vue({
    el: '#app',
    data: {
      list: [{
        flag: true,
        msg: '秒殺'
      },
      {
        flag: false,
        msg: ''
      },
      {
        flag: true,
        msg: '熱推'
      }]
    }
  })
</script></html>

76b1c821bd9fa6ebe7ca1b49ae1038a9.png

數組

<!DOCTYPE html><html lang="en"><head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>class綁定</title>
  <style>
    .class1 {
      font-size: 32px;
      color: #f66;
    }
    .class2 {
      background-color: #ccc;
    }
  </style>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body>
  <div id="app">
    <div class="class1 class2">class數組寫法</div>
    <div :class="[classa, classb]">class數組寫法</div>
  </div></body><script>
 
  new Vue({
    el: '#app',
    data: {
      classa: 'class1',
      classb: 'class2'
    }
  })
</script></html>

32d65a2e7acbce73f0e50a7ac62e6610.png

  • 作業:查看api 熟練使用style綁定對象形式和數組形式

條件判斷

v-if v-else-if v-else

v-show

注意審查元素查看效果

<body>
  <div id="app">
    <div v-if="flag">如果為真我就顯示</div>
    <div v-if="Math.random() < 0.2"> 0.2 </div>
    <div v-else-if="Math.random() < 0.8"> 0.8 </div>
    <div v-else="Math.random() < 1"> 1 </div>

    <div v-show="flag">如過為真我就顯示</div>
  </div></body><script>
  new Vue({
    el: '#app',
    data: {
      flag: false
    }
  })
</script>

a7c93e489583bbc14ab4e73d51962da5.png

作業: 什么時候使用v-if,什么時候使用v-show

列表渲染

v-for
key ********************************************

key 不可以重復、key可以為 用戶id、產品id,**id,因為id具有唯一性

node項目中使用uuid確保id是不重復的

4006a661c82a06e9a624cf544ed3cb6e.png

? 思考, js中 數組可以遍歷,對象能不能遍歷,字符串能不能遍歷

key

<body>
  <div id="app">
    <ul>
      <li v-for="item in arr1">{{ item }}</li>
    </ul>
    <ul>
      <li v-for="(item, index) in arr1" :key="index">{{ item }}</li>
    </ul>
    <ul>
      <li v-for="(item, index) of arr1" :key="item">{{ item }}</li>
    </ul>
  </div></body><script>
  var app = new Vue({
    el: '#app',
    data: {
      arr1: ['a', 'b', 'c']
    }
  })
</script>

多層遍歷

<body>
  <div id="app">
      <h1>遍歷數組  無key值</h1>
    <ul>
      <li v-for="item in arr1">{{ item }}</li>
    </ul>
    <h1>遍歷數組  key值為索引值</h1>
    <ul>
      <li v-for="(item, index) in arr1" :key="index">{{ item }}</li>
    </ul>
    <h1>遍歷數組  key值為唯一值</h1>
    <ul>
      <li v-for="(item, index) of arr1" :key="item">{{ item }}</li>
    </ul>
    <h1>遍歷對象數組</h1>
    <ul>
      <li v-for="item of arr2" :key="item.bannerid">
        <img :src="item.img" alt="">
      </li>
    </ul>
    <h1>多層遍歷,內層循環換個變量名和索引值是為了區分</h1>
    <ul>
      <li v-for="(item, index) of arr3" :key="index">
        <h1>{{ item.brand }}</h1>
        <ol>
          <li v-for="(itm, idx) of item.list" :key="idx">
            {{ itm }} - {{ item.brand }}
          </li>
        </ol>
      </li>
    </ul>
  </div></body><script>
  var app = new Vue({
    el: '#app',
    data: {
      arr1: ['a', 'b', 'c'],
      arr2: [{ bannerid: 'banner_1', img: 'https://m.360buyimg.com/mobilecms/s700x280_jfs/t1/89951/22/13835/67854/5e64a4b8E84c207d9/7367dad332fe905b.jpg!cr_1125x445_0_171!q70.jpg.dpg', href: '', alt: '' }, { bannerid: 'banner_2', img: 'https://imgcps.jd.com/ling4/1670651/6Z2i6Iac55yB5b-D55yB5Yqb/5ZOB6LSo5rqQ5LqO5Y2T6LaK/p-5c13869682acdd181deeff08/2d409b2d/cr_1125x445_0_171/s1125x690/q70.jpg', href: '', alt: '' }, { bannerid: 'banner_3', img: 'https://m.360buyimg.com/mobilecms/s700x280_jfs/t1/88149/40/14147/100076/5e6229a8Ef51e1321/54e2c5dd2c357e1e.jpg!cr_1125x445_0_171!q70.jpg.dpg', href: '', alt: '' }, { bannerid: 'banner_4', img: 'https://m.360buyimg.com/mobilecms/s700x280_jfs/t1/93827/39/13300/60640/5e561c60Edd0d8e34/73428f511893f63e.jpg!cr_1125x445_0_171!q70.jpg.dpg', href: '', alt: '' }],
      arr3: [{
        brand: '寶馬',
        list: ['X5', 'X6']
      },{
        brand: '奧迪',
        list: ['Q7', 'A8']
      }]
    }
  })
</script>

事件處理

  • 事件處理-行內
<body>
  <div id="app">
    <h3>計數器</h3>
    <div>
      <button v-on:click="count += 1">點擊</button> {{ count }} 次
    </div>
    <h3>案例 ---  簡單業務邏輯可以考慮使用 行內的事件處理</h3>
    <ul>
      <li v-for="(item, index) of list" :key="index">
        {{ item.name }} - 
        <button :disabled="item.num === 1" @click="item.num > 1 ? item.num -= 1: item.num = 1">-</button> 
        {{ item.num }}
        <button @click="item.num += 1">+</button>
      </li>
    </ul>
  </div></body><script>
  new Vue({
    el: '#app',
    data: {
      count: 0,
      list: [
        {
          name:'aaa',
          num:1
        },
        {
          name:'bbb',
          num:2
        }
      ]
    }
  })
</script>

總結:這也就是玩一玩而已,項目中一般不要使用,比如上一個案例,如果點擊 加 ,先向服務器發起更新數據庫的操作,得到回應后采取改變視圖

  • 事件處理-方法

不傳參可以不寫(),要傳參就傳對象

<body>
  <div id="app">
    <h3>計數器</h3>
    <div>
      <button v-on:click="countfn">點擊</button> {{ count }} 次
    </div>
    <h3>案例 --  傳對象</h3>
    <ul>
      <li v-for="(item, index) of list" :key="index">
        {{ item.name }} - 
        <button :disabled="item.num === 1" @click=" reduce(item)">-</button> 
        {{ item.num }}
        <button @click="add(item)">+</button>
      </li>
    </ul>
  </div></body><script>
  new Vue({
    el: '#app',
    data: {
      count: 0,
      list: [
        {
          name:'aaa',
          num:1
        },
        {
          name:'bbb',
          num:2
        }
      ]
    },
    methods: { // vue自定義的事件
      countfn () {
        this.count += 1
      },
      reduce (item) {
        // 服務器發起請求  --- 成功
        item.num > 1 ? item.num -= 1 : item.num = 1
      },
      add (item) {
        // 服務器發起請求  --- 成功
        item.num += 1
      }
    }
  })
</script>
  • 事件處理 - 事件對象
    不傳參,方法默認參數為事件對象
    36456e3ee6080eeb2f94e98ce5863afb.png
    7df39443f7bf53f7f99ce2b8e70e7a11.png

傳遞參數,並且獲取事件對象 - $event
5d57a49ac29eee8319f77089d7a34be8.png
2183ab69f8ba9f915ea56cecfa330ca1.png

? 思考:一般使用事件對象解決什么問題? ---- 復習js中的事件對象

阻止默認事件、阻止冒泡、獲取鼠標位置、獲取事件源、獲取DOM節點,傳遞數據,確定按鍵.........

利用事件對象阻止冒泡
b8df2328019d31fa86b87cfb6c45eabb.png

雖然可以利用事件對象解決冒泡問題,但是你還使用了 event事件對象

事件修飾符
07ffff76499a76d4819b3c69e88ce45e.png

常用的事件修飾符

<!-- 阻止單擊事件繼續傳播 --> 
<a v-on:click.stop="doThis"></a> 
<!-- 提交事件不再重載頁面 --> 
<form v-on:submit.prevent="onSubmit"></form> 
<!-- 修飾符可以串聯 --><a v-on:click.stop.prevent="doThat"></a><!-- 只有修飾符 --><form v-on:submit.prevent></form> 
<!-- 添加事件監聽器時使用事件捕獲模式 --> 
<!-- 即內部元素觸發的事件先在此處理,然后才交由內部元素進行處理 --> 
<div v-on:click.capture="doThis">...</div> 
<!-- 只當在 event.target 是當前元素自身時觸發處理函數 --><!-- 即事件不是從內部元素觸發的 --> 
<div v-on:click.self="doThat">...</div>

<!-- 點擊事件將只會觸發一次 --> 
<a v-on:click.once="doThis"></a>

<!-- 滾動事件的默認行為 (即滾動行為) 將會立即觸發 --><!-- 而不會等待 `onScroll` 完成 --> 
<!-- 這其中包含 `event.preventDefault()` 的情況 --> 
<!-- 這個 .passive 修飾符尤其能夠提升移動端的性能。 --><div v-on:scroll.passive="onScroll">...</div>

591e2e49285a73c82427dd5c8545d190.png

不要把 .passive 和 .prevent 一起使用,因為 .prevent 將會被忽略,同時瀏覽器可能會向你展示一個警告。請記住,.passive 會告訴瀏覽器你不想阻止事件的默認行為。

按鍵修飾符

efad1de26a3103a3d2a7883f61440f51.png
e5c40a99c537d4985d067b26079072db.png
image.png

72298df17dde00508691c8359566f3b4.png

表單的數據綁定

v-model

如果 v-model 表達式的初始值未能匹配任何選項,<select> 元素將被渲染為“未選中”狀態。在 iOS 中,這會使用戶無法選擇第一個選項。因為這樣的情況下,iOS 不會觸發 change 事件。

<body>
  <div id="app">
    <div>
      用戶名:
      <input type="text" v-mode="username" /> {{ username }}
    </div>
    <div>
      密碼:
      <input type="password" v-model="password" /> {{ password }}
    </div>
    <div>
      性別:
      <input type="radio" name="sex" value="1" v-model="sex">男
      <input type="radio" name="sex" value="0" v-model="sex">女
    </div>
    <div>
      愛好:
      <input type="checkbox" value="籃球" v-model="hobby">籃球
      <input type="checkbox" value="排球" v-model="hobby">排球
      <input type="checkbox" value="足球" v-model="hobby">足球
      <input type="checkbox" value="乒乓球" v-model="hobby">乒乓球
    </div>
    <div>
      階段
      <select v-model="lesson">
        <option disabled value="">請選擇</option>
        <option value="一階段">一階段</option>
        <option value="二階段">二階段</option>
        <option value="三階段">三階段</option>
      </select>
    </div>
    <div>
      備注:
      <textarea v-model="note"></textarea>
    </div>
    <div>
      <input type="checkbox" v-model='flag'>同意***協議
      {{ flag }}
    </div>
    <button @click="login">登陸</button>
  </div></body><script>
  var app = new Vue({
    el: '#app',
    data: { // Vue 實例也代理了 data 對象上所有的屬性
      username: '大勛勛',
      password: '123456',
      sex: '1',
      hobby: [], // 多選  ---  初始化數據為 數組
      lesson: '',
      note: '',
      flag: false // 選中還是未選中 - 單選 -- 初始化為boolean
    },
    methods: {
      login () {
        this.flag ? console.log({
          username: this.username,
          password: this.password,
          sex: this.sex === '1' ? '男' : '女',
          hobby: this.hobby,
          lesson: this.lesson,
          note: this.note
        }) : console.log('請先勾選同意此協議')
      }
    }
  })
  console.log(app.username)
  console.log(app.$data.username)
</script>

追加修飾符 lazy / number / trim
746c032dcd2cc8e2d0df7685b015f1a8.png

一般使用 trim 為居多

玩表單 不忘 v-model

v-model 有特殊

特殊1 checkbox 數組表多選 bool表單選

特殊2 select 不選第一項

計算屬性

任何復雜的業務邏輯,我們都應當使用計算屬性

計算屬性具有依賴性,只有依賴的那個值發生了改變,計算屬性才會重新計算,原數據不變,計算屬性就不會執行 --- 緩存

所有的計算屬性被包含在computed選項中

計算屬性其實就是一個函數,必須得返回一個值,使用形式形如data中的數據

<!DOCTYPE html><html lang="en"><head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>表單輸入綁定</title>
  <style>
    .error {
      color: #f00
    }
    .success {
      color: #0f0
    }
  </style>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body>
  <div id="app">
    <div>
      用戶名:
      <input type="text" v-model.trim="username" /> {{ username }} - <span v-html="usernametip"></span>
    </div>
    <div>
      密碼:
      <input type="password" v-model="password" /> {{ password }}
    </div>
    <div>
      性別:
      <input type="radio" name="sex" value="1" v-model="sex">男
      <input type="radio" name="sex" value="0" v-model="sex">女
    </div>
    <div>
      愛好:
      <input type="checkbox" value="籃球" v-model="hobby">籃球
      <input type="checkbox" value="排球" v-model="hobby">排球
      <input type="checkbox" value="足球" v-model="hobby">足球
      <input type="checkbox" value="乒乓球" v-model="hobby">乒乓球
    </div>
    <div>
      階段
      <select v-model="lesson">
        <option disabled value="">請選擇</option>
        <option value="一階段">一階段</option>
        <option value="二階段">二階段</option>
        <option value="三階段">三階段</option>
      </select>
    </div>
    <div>
      備注:
      <textarea v-model="note"></textarea>
    </div>
    <div>
      <input type="checkbox" v-model='flag'>同意***協議
      {{ flag }}
    </div>
    <button @click="login">登陸</button>
  </div></body><script>
  var app = new Vue({
    el: '#app',
    data: { // Vue 實例也代理了 data 對象上所有的屬性
      username: '',
      password: '',
      sex: '1',
      hobby: [], // 多選  ---  初始化數據為 數組
      lesson: '',
      note: '',
      flag: false // 選中還是未選中 - 單選 -- 初始化為boolean
    },
    computed: { // 計算屬性
      usernametip () {
        if (this.username === '') {
          return '<span>請輸入用戶名</span>'
        }
        if (this.username.length < 6) {
          return '<span class="error">用戶名格式錯誤</span>'
        } else {
          return '<span class="success">ok</span>'
        }
      }
    },
    methods: {
      login () {
        this.flag ? console.log({
          username: this.username,
          password: this.password,
          sex: this.sex === '1' ? '男' : '女',
          hobby: this.hobby,
          lesson: this.lesson,
          note: this.note
        }) : console.log('請先勾選同意此協議')
      }
    }
  })
  console.log(app.username)
  console.log(app.$data.username)
</script></html>

 

-------------------------------------------------------文章來自吳大勛( 大勛說


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM