vue 基础表达式及指令

218 阅读4分钟

vue基础-插值表达式

        vue 有一个最基本的功能: 数据渲染。将数据(变量或者利用 ajax 从后端获取到的数据) 展示到页面上。这里它不会直接操作 dom ,而是有自己的语法。

    <template>
      <div>
        <h2>01插件表达式</h2>
        <p>名字是:{{ (name + "天托") }}</p>   //拼接
        <p>年龄是:{{ info.age }}</p>
        <p>品种是:{{ info.age > 18 ? "老桑" : "小桑" }}</p> //三元
        <p>爱好是:{{ arr[0] }}</p>
      </div>
    </template>
    
    <script>
    //表达式:可以被console.log就是表达式
    export default {
      data() {
        return {
          name: "某桑",
          info: {
            age: 18,
          },
          arr: ["Like to smoke"],
        };
      },
    };
    </script>
    

         在 vue{{}} 语法,叫做: 插值表达式,就是输出{{}}中的表达式的值的语法

把 **{{}}** 理解为一个占位符(一个坑),{{msg}}就是把msg显示在这个占位符中(把msg插到坑里面去)

语法

{{}} 可以:

  • data 数据字段名称

  • data 数据字段进行表达式运算

    • 拼接
    • 算术运算
    • 三元运算
    • ...

{{}} 不能:

  • js 语句: 声明变量,分支,循环
  • 访问在 vue 实例中的 data 之外定义的自定义的变量

vue指令 v-bind

作用

         v-bind 用来动态绑定标签上的属性的值。(标签上的属性值不能使用插值表达式来设置)。

格式

   1   <元素 v-bind:属性名1="值1" v-bind:属性名2="值2"></元素>
   2   // 简写, 省略v-bind
   3   <元素 :属性名1="值1" :属性名2="值2"></元素>
   4
   5   //v-bind指令简写方法 : 冒号
   6   <img :src="data数据">

示例

        <template>
          <div>
            <h2>v-bind</h2>
            <p>名字是:{{ name }}</p>
            <!-- <img v-bind:src = "imgUrl" alt = ""> -->
            <!-- 简写 -->
            <img :src="imgUrl" alt="" />
          </div>
        </template>
        
        <script>
        // v-bind: 动态绑定标签的属性值
        export default {
          data() {
            return {
              name: "小猴",
              imgUrl:'图片链接'                                                   
            };
          },
        };
        </script>

vue指令 v-for

功能

        列表渲染,所在标签解构,按照数据数量循环生成。

语法

  1   <标签 v-for="(值, 索引或者属性名) in 目标结构" :key="唯一值"></标签>
  • 索引可以省略
  • 目标解构可以是: 数组/对象/数字

示例

        <template>
          <div>
            <h2>v-for</h2>
            <ul>
              <!-- 
                数组
                item 就循环变量,用来指向当前的数组元素
                idx:下标 
                key要是一个在循环的过程中的唯一值
              -->
              <li v-for="(item, idx) in arr" :key="item.id">
                {{ idx + 1 }}, {{ item.name }}, {{ item }}, {{ idx }}
              </li>
            </ul>
            <ul>
              <!-- {{item}} -->
              <li v-for="item in list" :key="item.id">
                {{ item.title }}
              </li>
            </ul>
            <hr />
            <!-- 对象 -->
            <p v-for="(value, propName) in obj" :key="propName">
              {{ value }}-{{ propName }}
            </p>
            <hr />
            <!-- 数字 -->
            <p v-for="idx in 100" :key="idx">{{ idx }} I miss you</p>
          </div>
        </template>
        
        <script>
        export default {
          data() {
            return {
              obj: { a: 1, b: 2 },
              arr: [
                { id: 1, name: "小花" },
                { id: 2, name: "小明" },
                { id: 3, name: "小白" },
              ],
              list: [{ id: 1, title: "新闻1" }],
            };
          },
        };
        </script>

小结

  1. v-for的功能是对标签进行循环生成
  2. 快速把数据赋予到相同的dom结构上循环生成

vue指令v-text和v-html

语法

 1   v-text="vue数据变量"
 2   v-html="vue数据变量"
 

示例

       <template>
         <div>
           <h2>v-text,v-html</h2>
           <p v-text="str"></p>
           <p v-html="str"></p>
         </div>
       </template>
       
       <script>
       export default {
         data() {
           return {
             str: "<span>我是一个span标签</span>",
           };
         },
       };
       </script>

小结

  1. v-text把值当成普通字符串显示, v-text ===> innerText

  2. v-html把值当做html解析,v-html ===> innerHTML

vue指令v-show和v-if

语法

   1  <标签 v-show="vue变量" />  //v-show 用的display:none隐藏   (频繁切换使用)
   2  <标签 v-if="vue变量" />   //v-if  直接从DOM树上添加或移除
   3  
   4  如果vue变量的值为true,就可见,否则就不可见。
   

示例

      <template>
        <div>
          <h2>v-show,v-if</h2>
          <p v-show="isOK">v-show</p>
          <p v-if="isOK">v-if</p>
        </div>
      </template>
      
      <script>
      export default {
        data(){
          return{
            isOK: true
          }
        }
      }
      </script>

小结

  • v-show性能较好,对应需要频繁切换显示与隐藏的功能,可以使用 v-show

    • 注意无论变量是否为 true ,它一定会创建元素
  • v-if会动态创建和删除元素

    • 在频繁的切换可见与不可见时,它的效率会低一点
    • 如果变量的值为 false ,它将不会创建元素
    • 使用场景: 如果是登陆用户就显示头像 <img src="xxx" v-if="isLogin">

vue指令v-if,v-else-if,else

语法

  1     //与js中的if选择结构是一致的。
  2     
  3     <标签 v-if="条件">        </标签> 
  4     <标签 v-else-if="条件">   </标签> 
  5     <标签 v-else-if="条件">   </标签> 
  6     <标签 v-else>             </标签>

示例

        <template>
          <div>
            <p v-if="mark > 80">优秀</p>
            <p v-else-if="mark >= 60">一般</p>
            <p v-else>不及格</p>
          </div>
        </template>
        
        <script>
        export default {
          data() {
            return {
              mark: 60,
            };
          },
        };
        </script>

v-on和methods

作用

        给标签绑定事件

语法

 1  <标签 v-on:事件名="要执行的少量代码" >
 2  <标签 v-on:事件名="methods中的函数" >
 3  <标签 v-on:事件名="methods中的函数(实参)">
 4
 5  //v-on可以简写成 @ 即 @事件名="methods中的函数"
 6  //事件名可以是任意合法的dom事件

示例

        <template>
          <div>
            <h2>v-on</h2>
            <p>num:{{ num }}</p>
            <button v-on:click="num = 2">执行少量的代码</button>
            <br />
            <button @mouseenter="fn">鼠标进入-执行methods中的函数</button>
            <br />
            <button v-on:click="fn2(100)">执行methods中的函数,传入实参</button>
            <br />
            <button v-on:click="fn3">打印this</button>
          </div>
        </template>
        
        <script>
        export default {
          data() {
            return {
              num: 1,
            };
          },
          // vue的配置项
          // 定义函数
          //this会指向当前的组件
          methods: {
            fn: function () {
              console.log("fn");
            },
            fn2(n) {
              console.log(n);
            },
            fn3() {
              //访问数据
              console.log(this, this.age);
              //调用其他的methods
              this.fn();
            },
          },
        };
        </script>

vue配置项 methods

作用

        它是一个对象,在这个对象中定义函数

格式

   1   export default {
   2    methods: {
   3      函数1: function(){
   4      },
   5      函数2(){
   6      }
   7   }

使用场景

  1. v-on 配合使用
  2. methods 内部访问数据 this.xxx
  3. methods 内部调用其他的 methods

vue指令 v-on事件对象

语法:

  • 无传参, 通过形参直接接收
  • 传参, 通过 $event 指代事件对象传给事件处理函数

示例

       <template>
         <div>
           <h2>事件对象</h2>
           <a @click="one" href="http://www.baidu.com">阻止百度</a>
           <hr>
           <a @click="two(10, $event)" href="http://www.baidu.com">阻止去百度</a>
         </div>
       </template>
       
       <script>
       export default {
         methods: {
           one(e) {
             e.preventDefault();
           },
           two(num, e) {
             e.preventDefault();
           },
         },
       };
       </script>

vue指令 v-on事件修饰符

语法

   1     //<标签 @事件名.修饰符="methods里函数" />
   2    
   3    .stop     //阻止事件冒泡
   4    .prevent  //阻止默认行为
   5    .once     //程序运行期间, 只触发一次事件处理函数

示例

<template>

  <div @click="fatherFn">
    <h2>事件修饰符</h2>
    <!-- vue对事件进行了修饰符设置, 在事件后面.修饰符名即可使用更多的功能 -->
    <button @click.stop="btn">.stop阻止事件冒泡</button><br>
    <a href="http://www.baidu.com" @click.prevent="btn">.prevent阻止默认行为</a><br>
    <button @click.once="btn">.once程序运行期间, 只触发一次事件处理函数</button><br>
  </div>
</template>

<script>
export default {
  methods: {
    fatherFn(){
      console.log("father被触发");
    },
    btn(){
      console.log(1);
    }
  }
}
</script>

vue指令 v-on按键修饰符

语法

 1   @keyup.enter    //监测回车按键
 2   @keyup.esc        //监测返回按键

示例

       <template>
         <div>
           <h2>v-on按键修饰符</h2>
           <!-- 在输入框中按下回车键才会执行fn -->
           <input @keyup.enter ="fn"/>
           
         </div>
       </template>
       
       <script>
       export default {
         methods:{
           fn(){
             console.log('键盘抬起了')
           }
         }
       }
       </script>

vue指令 v-model双向绑定

语法

  • v-model="data数据变量"

  • 双向数据绑定

    • 数据变化 -> 视图自动同步
    • 视图变化 -> 数据自动同步

        v-model适用于表单开发,自动获取用户输入或选择数据

示例

        <template>
          <div>
            <!-- 
            	v-model:是实现vuejs变量和表单标签value属性, 双向绑定的指令
            -->
            <!-- 绑定输入 -->
            <div>
              <span>用户名:</span>
              <input type="text" v-model="username" />
            </div>
            <div>
              <span>密码:</span>
              <input type="password" v-model="pass" />
            </div>
            
            <!-- 绑定选择 -->
            <div>
              <span>来自于哪里?</span>
              <select v-model="from">
                <option value="西安">陕西-西安</option>
                <option value="燕京">北京-燕京</option>
                <option value="大连">辽宁-大连</option>
              </select>
            </div>
            
            <div>
              <!-- checkbox特殊, 内部判断v-model是数组, 绑定value值 -->  
              <span>爱好</span>
              <input type="checkbox" v-model="hobby" value="吃饭" /><span>吃饭</span>
              <input type="checkbox" v-model="hobby" value="逛街" /><span>逛街</span>
              <input type="checkbox" v-model="hobby" value="旅游" /><span>旅游</span>
            </div>
          </div>
        </template>
        
        <script>
        export default {
          data() {
            return {
              username: "",
              pass: "",
              from: "",
              hobby: [], 
            }
          }
        };
        </script>

vue指令-v-model修饰符

语法

 1   //  v-model.修饰符 = "vue数据变量"
 2
 3    .number  //以 parseFloat转成数字类型
 4    .trim    //去除首尾空白字符
 5    .lazy    //在失去焦点时触发更改而非 input时
 

示例

       <template>
         <div>
           <div>
             <span>年纪:</span>
             <input type="text" v-model.number="age">
           </div>
           <div>
             <span>各人爱好:</span>
             <input type="text" v-model.trim="motto">
           </div>
           <div>
             <span>自我介绍:</span>
             <textarea v-model.lazy="intro"></textarea>
           </div>
         </div>
       </template>
       
       <script>
       export default {
         data() {
           return {
             age: "",
             motto: "",
             intro: ""
           }
         }
       }
       </script>