vue指令

v-bind

目標: 給標簽屬性設置vue變量的值

  • 語法:v-bind:屬性名="vue變量"
  • 簡寫::屬性名="vue變量"
<template>
  <div id="app">
    <h1>{{msg}}</h1>
    <h2>{{ obj.name }}</h2>
    <h3>{{ obj.age > 18 ? '成年' : '未成年' }}</h3>
  <img v-bind:src="img" alt="">
  <a v-bind:href="url">點我</a>
  <!-- v-bind可以省略 -->
  <img :src="img" alt=""> 
  <a :href="url">點我</a>
  </div>
</template>

<script>
export default {
  data () {
    return {
      msg:"你好呀!",
      obj: {
        name: "小vue",
        age: 5
      },
      img:"https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png",
      url:"http://www.baidu.com"
    }
  }
}
// console.log(1234566);
</script>

<style scoped>

</style>

目標:用v-bind給標簽class設置動態的值

語法 :class="{類名: 布爾值}" ,true使用, false不用

<template>
  <div>
    <button v-on:click="bool=!bool">切換類名</button>
    <div :class="{redClass:bool}">動態綁定class</div>
  </div>
</template>

<script>
export default {
  data () {
    return {
     bool:true
    }
  },
  
}
</script>
<style scoped>
.redClass{
  color: red;
}
</style>

目標:給標簽動態設置style的值

語法 :style="{css屬性名: 值}"

<template>
  <div>
    <button @click="colorStr='green'">變成綠色</button>
    <button @click="colorStr='blue'">變成藍色</button>
    <button @click="colorStr='red'">變成紅色</button>
    <div :style="{color:colorStr,fontSize:'80 px'}">動態綁定 style</div>
  </div>
</template>
<script>
export default {
  data () {
    return {
    //設置默認顏色
     colorStr:'red'
    }
  },
  
}
</script>

<style scoped>

</style>

v-on

目標: 給標簽綁定事件

  • 語法
    • v-on:事件名="要執行的==少量代碼=="
    • v-on:事件名="methods中的函數"
    • v-on:事件名="methods中的函數(實參)"
  • 簡寫: @事件名="methods中的函數"
<template>
  <div>
    <h1>當前數量:{{count}}</h1>
    <button v-on:click="()=>{count+=1}">點擊</button>
      <!--簡寫-->
    <button v-on:click="count=count+=1">點擊</button>
    <h1>當前金額:{{money}}</h1>
    <!-- 簡寫 -->
    <button v-on:click="money+=10">點擊</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      count:1,
      money:10
    }
  }
}
</script>

<style scoped>

</style>

v-on事件對象

語法:

  • 無傳參, 通過形參直接接收
  • 傳參, 通過$event指代事件對象傳給事件處理函數
<template>
  <div>
    <h1>當前數量:{{count}}</h1>
    <button v-on:click="()=>{count+=1}">點擊</button>
    <!-- 簡寫 -->
    <button v-on:click="addFn">點擊觸發add</button>
    <button v-on:click="addFncount(-10)">減少10個</button>
    <!-- 增加10 -->
    <!-- v-on: 簡寫用  @ 替代 -->
    <button @click="addFncount(10)">增加10個</button>
  </div>
</template>

<script>
export default {
  data () {
    return {//返回的其實是一個對象
      count:1,
    }
  },
  methods:{
addFn(){
  console.log("點擊觸發add");
  this.count+=1
},
// 帶參數的寫法
addFncount(num){
  this.count+=num 
}
  },
}
</script>

<style scoped>

</style>

v-on修飾符

語法:

  • @事件名.修飾符="methods里函數"
    • .stop - 阻止事件冒泡
    • .prevent - 阻止默認行為
    • .once - 程序運行期間, 只觸發一次事件處理函數
<template>
  <div>
<h1>事件修飾符</h1>
<div class="box" @click="faterFn">父元素</div>
  <!-- .stop阻止事件冒泡 -->
  <button @click.stop="btn">.stop阻止事件冒泡</button>
  <!-- .prevent阻止默認事件 -->
  <!-- 可以同時多個事件一起 阻止默認+阻止冒泡 -->
  <a  @click.prevent.stop="btn3">.prevent阻止事件冒泡</a>
  <button @click.once="btn">.once程序運行期間,只觸發一次事件處理函數</button>

  </div>
</template>

<script>
export default {
  methods:{
    faterFn(){
      console.log("faterFn被點擊了");
    },
    btn(){
      console.log(111);
    },
    btn3() {
      console.log("被點擊了,但是沒有跳轉,設置了阻止默認行為");
    }, 
  }

}
</script>

<style scoped>

</style>

v-on按鍵修飾符

語法:

  • @keyup.enter - 監測回車按鍵
  • @keyup.esc - 監測返回按鍵
  • @keyup.字母 - 監測返回對應的字母按鍵
<template>
  <div>
    <input type="text" @keydown.enter="enterFn" placeholder="enter鍵觸發" />
    <hr />
    <!-- 修飾符只能小寫字母 -->
    <!-- 但是鍵盤輸入大小寫都能觸發事件 -->
    <input type="text" @keydown.a="aFn" placeholder="a鍵觸發" />
    <hr />
    <input type="text" @keydown.K="KFn" placeholder="k鍵觸發" />
  </div>
</template>

<script>
export default {
  methods: {
    enterFn() {
      console.log("按下enter鍵");
    },
    aFn() {
      console.log("按下a鍵");
    },
    KFn() {
      console.log("按下K鍵");
    },
  },
};
</script>

<style scoped>
</style>


v-model

  • 語法: v-model="vue數據變量"
  • 雙向數據綁定
    • 數據變化 -> 視圖自動同步
    • 視圖變化 -> 數據自動同步
<template>
  <div>
<h1>v-model雙向數據綁定</h1>
用戶名<input type="text" v-model="username">
密碼<input type="password" v-model="password">
<button @click="loginBtn">登錄</button>
  </div>
</template>

<script>
export default {
  data () {
    return{
      username:"匿名用戶",
      password:"123456"
    
  },
  methods:{
    loginBtn(){
      console.log("用戶名:",this.username);
      console.log("密碼:",this.password);
    }
  }

}
</script>

下拉菜單寫在select,value在option上

<template>
  <div>
# 注意-model是給select標簽綁定,value在option上   
    <div>
      <select v-model="city">
        <option value="廣州">廣州</option>
        <option value="上海">上海</option>
        <option value="杭州">杭州</option>
        <option value="北京">北京</option>
        <option value="深圳">深圳</option>
      </select>
    </div>
    <!-- 復選框 -->
    <div>
      <label
        ><input
          type="checkbox"
          name=""
          value="唱歌"
          v-model="hobby"
        />唱歌</label
      >
      <label
        ><input
          type="checkbox"
          name=""
          value="爬山"
          v-model="hobby"
        />爬山</label
      >
      <label
        ><input
          type="checkbox"
          name=""
          value="睡覺"
          v-model="hobby"
        />睡覺</labe
      >
      <label
        ><input
          type="checkbox"
          name=""
          value="吃飯"
          v-model="hobby"
        />吃飯</label
      >
    </div>
    <!-- 單選框 -->
    <div>
      <label><input type="radio" value="男" v-model="gender" />男</label>
      <label><input type="radio" value="女" v-model="gender" />女</label>
    </div>
    <div>
      <!-- 自我介紹 -->
      <!-- 失去焦點再收集數據 -->
      <textarea v-model.lazy="intro"></textarea>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 下拉框默認城市
      city: "廣州",
      // 設置為具體某個就["吃飯"]
      // 復選框收集多個數據,初始值要設置為數組
      hobby: [],
      // 單選框默認性別
      gender: "男",
      // 自我介紹
      intro: "",
    };
  },
};
</script>

v-model用在復選框時,v-model的vue變量分兩種

# 非數組 – 關聯的是checked屬性
# 數組  – 關聯的是value屬性
<template>
  <div><input type="checkbox" checked="text" v-model="text" />學習</div>
</template>

<script>
export default {
  data() {
    return {
    //text: true,
      text: "",
    };
  },
};
</script>

v-model修飾符

語法: v-model.修飾符="Vue數據變量"

# .number  以parseFloat轉成數字類型
# .trim     去除字符串首尾空白字符
# .lazy     失去焦點后才收集數據(change)而非inupt時
<template>
  <div>
    <input type="text" v-model.trim="username" />
    <input type="text" v-model.number="age" />
    <textarea name="" id="" cols="30" rows="10" v-model.lazy="text"></textarea>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: "哈哈哈",
      age: 18,
      text: "",
    };
  },
};
</script>

v-text/v-html

語法:

  • v-text="vue數據變量"
  • v-html="vue數據變量"
<template>
  <div>
    <p v-text="str"></p>
    <p v-html="str"></p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      str: "<span>我是一個span標簽</span>"
    }
  }
}
</script>

v-show/v-if

語法:

  • v-show="vue變量"
  • v-if="vue變量"

原理

  • v-show 用的display:none隱藏 (頻繁切換使用)
  • v-if 直接從DOM樹上移除
  • v-if可以配合v-else或者v-else-if使用

高級

  • v-else的使用
<template>
  <div>
#    <!-- true的看的見 -->
#    <!-- v-show后可接變量再去給變量設置布爾值,也可直接接布爾值 -->
    <h1>v-show后可接變量,也可直接接布爾值</h1>
    <h1 v-show="true">這是v-show的盒子接布爾值</h1>
    <h1 v-show="isok">這是v-show的盒子接變量</h1>
    <button @click="isok = !isok">顯示或隱藏接變量的</button>
#    <!-- 寫成事件型 -->
    <button @click="btnFn">顯示或隱藏接變量的</button>
#    <!-- false 看不見 -->
    <h1 v-if="isNo">v-if的盒子</h1>

    <div>
 #     <!-- 判斷語句 -->
 #     <!-- 如果滿足age>18就輸出v-if的,不滿足的就輸出v-else -->
      <p v-if="age > 18">滿18啦</p>
      <p v-else>18都沒有</p>
 #    v-show 讓盒子顯示或隱藏 display:none 
 #     v-if   讓盒子創建或者刪除  性能開銷更大
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      //
      isok: true,
      isNo: false,
      age: 20,
    };
  },
  methods: {
  
    btnFn() {
#     取反
      this.isok = !this.isok;
    },
  },
};
</script>

v-if 和v-else

<template>
  <div>
    <button v-on:click="isShow = !isShow">切換狀態</button>

    <ul v-if="isShow">
      <li>1</li>
      <li>2</li>
      <li>3</li>
    </ul>
#  v-else書寫需要和v-if同級 
#  v-else和v-if互斥
#  應用場景: 列表狀態與空狀態切換,加載狀態切換
    <div v-else>空狀態</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isShow: false,
    };
  },
};
</script>

v-for

語法:

  • v-for="(值變量, 索引變量) in 目標結構"
  • v-for="值變量 in 目標結構"

目標結構:

  • 可以遍歷數組 / 對象 / 數字 / 字符串 (可遍歷結構)

注意:

  • v-for的臨時變量名不能用到v-for范圍外
<template>
  <div>
    <h1>列表渲染 v-for</h1>
    <ul>
#           v-for="值變量 in 目標結構"
#           :key ="唯一標識"

      <li v-for="item in arr" :key="item">{{ item }}</li>
      <!-- 注意:v-for的臨時變量不能用到v-for范圍外 -->
    </ul>
    <button @click="btn">11</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      arr: ["劉備", "關羽", "張飛"],
    };
  },
  methods: {
    btn() {
#    重復添加就會報錯,出現重復鍵---key得唯一
      this.arr.push("11");
    },
  },
};
</script>

帶下標的

#           v-for="(值變量,下標) in 目標結構"
<template>
  <div>
    <h1>列表渲染 v-for</h1>
    <ul>
      <li v-for="item in arr" :key="item">{{ item }}</li>
    </ul>
    <h1>獲取下標(索引)</h1>
    <ul>
      <li v-for="(item, index) in arr" :key="item">{{ item }}---{{ index }}</li>
    </ul>
    <h1>數組的每一項是對象--項目常見</h1>
    <ul>
      <li v-for="(item, index) in arrObj" :key="item">
        {{ item.id }}----{{ index }}
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      arr: ["劉備", "關羽", "張飛"],
      arrObj: [
        { id: "1", name: "劉備" },
        { id: "2", name: "曹操" },
        { id: "3", name: "孫權" },
      ],
    };
  },
};
</script>

其他的使用

# key的要求:唯一不重復的字符串或者數值
<template>
  <div>
    <h1>列表渲染 v-for</h1>
    <h2>遍歷對象</h2>
    <div>
      <ul>
        <li v-for="(value, key) in obj" :key="key">{{ key }} : {{ value }}</li>
      </ul>
    </div>
    <h2>遍歷數字</h2>
    <div>
      <ul>
        <li v-for="item in 10" :key="item"></li>
      </ul>
    </div>
    <h1>數組的每一項是對象--項目常見</h1>
    <div>
      <ul>
        <!-- :key=item 報錯,因為沒有唯一   :key要唯一標識 -->
        <li v-for="(item, index) in list" :key="item.id">
          {{ item.id }}----{{ index }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      obj: {
        username: "哈哈",
        age: "18",
        sex: "女",
      },
      arr: ["劉備", "關羽", "張飛"],
      list: [
        { id: "1", name: "諸葛亮" },
        { id: "2", name: "曹操" },
        { id: "3", name: "孫權" },
      ],
    };
  },
};
</script>

v-for更新監測

# 數組采用會改變原始數據的更新方法, 才導致v-for更新頁面
# 這些方法會觸發數組改變, v-for會監測到并更新頁面
push()
pop()
shift()
unshift()
splice()
sort()
reverse()

#  這些方法不會觸發v-for更新
slice()
filter()
concat()
# 注意: vue不能監測到數組里賦值的動作而更新, 如果需要請使用Vue.set() 或者this.$set(), 或者覆蓋整個數組
<template>
  <div>
    <button v-on:click="btn01">點擊翻轉</button>
    <button v-on:click="btn02">截取前兩位</button>
    <button v-on:click="btn03">將第一位修改為其他值</button>
    <h1>請選擇喜歡的項目</h1>
    <label v-for="item in arr" :key="item">
      <input type="checkbox" v-model="hobby" v-bind:value="item" />{{ item }}
    </label>
    <h2>選中的列表</h2>
    <ul>
      <li v-for="item in hobby" :key="item">{{ item }}</li>
    </ul>
  </div>
</template>
<script>
export default {
  data() {
    return {
      arr: ["科幻", "喜劇", "動漫", "冒險", "科技", "軍事", "娛樂", "奇聞"],
      hobby: [],
    };
  },
  methods: {
    btn01() {
      this.arr.reverse();
    },
    btn02() {
      // this.arr.slice(0, 2)這樣是不會直接影響到原數組的,所以重新賦值給this.arr
      this.arr = this.arr.slice(0, 2);
    },
    btn03() {
      // vue2 常見問題:直接通過下標修改,數據變化,但是視圖不會更新
      // this.arr[0] = "嗚嗚嗚";
      // console.log(this.arr);
      // 解決方法 $set
      // this.$set(原數組,數組下標,'修改后的值')
      this.$set(this.arr, 0, "煩躁");
    },
  },
};
# 口訣:
# 數組方法會改變原數組,就會導致v-for更新,頁面更新
# 數組方法不會改變原數組,而是返回新數組,就不會導致v-for更新,可采用覆蓋原數組或者this.$set()
# 
</script>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 注意: 1、所謂指令,其實就是元素的屬性 2、所有的指令,前提是在js中聲明了是Vue對象 3、參數 1、靜態參數...
    張浩琦閱讀 357評論 0 0
  • 頁面展示 基本指令 v-text用于在頁面中展示數據,可以簡寫為{{ }}的形式 {{msg}} <!--這兩...
    羊烊羴閱讀 1,526評論 0 0
  • 大綱 1、什么是vue指令2、向指令中傳入參數3、指令中帶入修飾符4、指令的縮寫5、常見的vue指令5.1、v-m...
    前端路上的小兵閱讀 958評論 1 3
  • 原文 博客原文 大綱 1、什么是vue指令2、向指令中傳入參數3、指令中帶入修飾符4、指令的縮寫5、常見的vue指...
    前端路上的小兵閱讀 469評論 0 8
  • 1. v-text v-text主要用來更新textContent,可以等同于JS的text屬性。 這兩者等價: ...
    問題_解決_分享_討論_最優閱讀 225評論 0 2