Vue基础教程--基本指令(一)

1 Vue的基本代码

<!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>Document</title>
  <!-- 1. 导入Vue的包 -->
  <script src="./lib/vue-2.4.0.js"></script>
</head>

<body>
  <!-- 将来 new 的Vue实例,会控制这个 元素中的所有内容 -->
  <!-- Vue 实例所控制的这个元素区域,就是我们的 V  -->
  <div id="app">
    <p>{
   
   { msg }}</p>
  </div>

  <script>
    // 2. 创建一个Vue的实例
    // 当我们导入包之后,在浏览器的内存中,就多了一个 Vue 构造函数
    //  注意:我们 new 出来的这个 vm 对象,就是我们 MVVM中的 VM调度者
    var vm = new Vue({
     
     
      el: '#app',  // 表示,当前我们 new 的这个 Vue 实例,要控制页面上的哪个区域
      // 这里的 data 就是 MVVM中的 M,专门用来保存 每个页面的数据的
      data: {
     
      // data 属性中,存放的是 el 中要用到的数据
        msg: '欢迎学习来到晶之佳缘博客' // 通过 Vue 提供的指令,很方便的就能把数据渲染到页面上,程序员不再手动操作DOM元素了【前端的Vue之类的框架,不提倡我们去手动操作DOM元素了】
      }
    })
  </script>
</body>

</html>

效果展示

2 Vue指令学习

<!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>Document</title>
</head>

<body>
  <div id="app">
     后续代码添加位置
  </div>


  <script src="./lib/vue-2.4.0.js"></script>

  <script>
    var vm = new Vue({
     
     
      el: '#app',
      data: {
     
     
        msg: 'v-cloak指令',
        msgtext: 'v-text指令',
		msghtml: '<h1>v-html指令</h1>',
        mytitle: 'v-bind指令'
      },
      methods: {
     
      // 这个 methods属性中定义了当前Vue实例所有可用的方法
        show: function () {
     
     
          alert('v-on指令')
        }
      }
    })

  </script>
</body>
</html>

2.1 v-cloak指令

v-cloak指令:当数据未解析完成时会渲染什么样式,和 css 规则如[v-cloak] { display: none }一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。

效果展示
在这里插入图片描述
从效果展示可以看出没有加v-cloak指令的会存在闪烁效果从{ { msg }}变成v-cloak指令,加上之后会显示css的display: none相关,等vue成功加载出来正确显示v-cloak指令

2.2 v-text指令

v-text指令:以纯文本方式显示数据;

  • v-text 是没有闪烁问题的
  • v-text会覆盖元素中原本的内容,但是 插值表达式 只会替换自己的这个占位符,不会把 整个元素的内容清空
  <p>原本 {
   
   { msgtext }} 内容</p>
  <p v-text="msgtext">原本内容</p>

效果展示
在这里插入图片描述
从效果展示可以看出v-text指令与{ {}}插值表达式的区别:

  1. 没有闪烁问题(没有动态效果可以自行去演示)
  2. 会覆盖元素中原本的内容

2.3 v-html指令

v-html指令:可以识别HTML标签;

    <div>{
   
   {msghtml}}</div>
    <div v-text="msghtml"></div>
    <div v-html="msghtml">原本内容</div>

在这里插入图片描述
从效果展示可以看出v-html与v-text唯一的特点就是可以正确识别html的标签。

2.4 v-bind指令

v-bind指令:是 Vue中,提供的用于绑定属性的指令

  • v-bind: 指令可以被简写为 :要绑定的属性
  • v-bind 中可以写合法的JS表达式
  • v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定(v-model双向绑定)
<input type="button" value="按钮" v-bind:title="mytitle + 'vue学习'">
<input type="button" value="按钮" :title="mytitle + 'vue学习'">

效果展示
在这里插入图片描述
从效果展示可以看出v-bind可以绑定相关属性,同时v-bind:title可以缩写成:title,v-bind 中也可以写合法的JS表达式。

2.5 v-on指令

v-on指令: 事件绑定机制

  • v-bind: 指令可以被简写为 @要绑定的事件
<input type="button" value="按钮" v-on:click="show">
<input type="button" value="按钮" @click="show">

效果展示
在这里插入图片描述

从效果展示可以看出v-on可以绑定相关事件,同时v-on:click可以缩写成:@click。

2.5.1 事件修饰符

  <style>
    .inner {
     
     
      height: 98px;
      width: 160px;
      padding: 40px;
      background-color: antiquewhite;
    }

    .outer {
     
     
      padding: 40px;
      background-color: pink;
    }
  </style>


  <script>
    var vm = new Vue({
     
     
      el: '#app',
      data: {
     
     },
      methods: {
     
     
        buttonShow() {
     
     
          alert('按钮点击事件')
        },
        innerDivShow() {
     
     
          alert('inner div 点击事件')
        },
        outDivShow() {
     
     
          alert('触发了连接的点击事件')
        },
        linkClick(){
     
     
          alert('百度')
        }
      }
    });
  </script>

2.5.1.1 .stop阻止冒泡

    <!-- 使用  .stop  阻止冒泡 -->
     <div class="inner" @click="innerDivShow">
      <input type="button" value="按钮" @click="buttonShow">
    </div>
    <hr/>
    <div class="inner" @click="innerDivShow">
      <input type="button" value="按钮" @click.stop="buttonShow">
    </div>

效果展示
在这里插入图片描述
从效果展示可以看出加上.stop的按钮只触发了按钮,没有触发div的点击事件,成功阻止了冒泡

2.5.1.2 .prevent阻止默认事件

效果展示

    <!-- 使用 .prevent 阻止默认行为 -->
    <a href="http://www.baidu.com" @click.prevent="linkClick">百度搜索</a>
    <a href="http://www.baidu.com" @click="linkClick">百度搜索</a>

在这里插入图片描述
从效果展示可以看出加上.prevent的超链接没有完成< a >的默认事件跳到百度页面,只是弹出了提示框。

2.5.1.3 .capture添加事件侦听器时使用事件捕获模式

    <!-- 使用  .capture 实现捕获触发事件的机制 -->
    <div class="inner" @click="innerDivShow">
      <input type="button" value="按钮" @click="buttonShow">
    </div>
    <hr/>
    <div class="inner" @click.capture="innerDivShow">
      <input type="button" value="按钮" @click="buttonShow">
    </div>

效果展示
在这里插入图片描述

从效果展示可以看出加上.capture后先触发的是innerDivShow事件,然后在触发buttonShow,与默认的冒泡处理顺序相反。

2.5.1.4 .self只当事件在该元素本身(比如不是子元素)触发时触发回调

    <!-- 使用 .self 实现只有点击当前元素时候,才会触发事件处理函数 -->
     <div class="inner" @click="innerDivShow">
      <input type="button" value="按钮" @click="buttonShow">
    </div>
    <hr/>
    <div class="inner" @click.self="innerDivShow">
      <input type="button" value="按钮" @click="buttonShow">
    </div>

效果展示
在这里插入图片描述
从效果展示可以看出加上.self点击内部的按钮不会触发本身的事件,只有点击自身才会弹出信息。

2.5.1.5 .once事件只触发一次

    <!-- 使用 .once 只触发一次事件处理函数 -->
     <a href="http://www.baidu.com" @click.prevent.once="linkClick">百度搜索</a>

效果展示
在这里插入图片描述

从效果展示可以看出加上.once 点击了两次百度搜索linkClick只触发一次,第二次成功跳转到百度首页。

2.5.1.6 .self和.stop区别

     <!-- 演示: .stop 和 .self 的区别 -->
     <div class="outer" @click="outDivShow">
      <div class="inner" @click="innerDivShow">
        <input type="button" value="按钮" @click.stop="buttonShow">
      </div>
    </div> 
    <hr/>
    <!-- .self 只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为 -->
     <div class="outer" @click="outDivShow">
      <div class="inner" @click.self="innerDivShow">
        <input type="button" value="按钮" @click="buttonShow">
      </div>
    </div> 

效果展示
在这里插入图片描述
从效果展示可以看出.stop可以成功阻止冒泡事件,.self只能让自身不受影响。

2.6 v-model指令

  <div id="app">
    <h4>{
   
   { msg }}</h4>

    <!-- 使用  v-model 指令,可以实现 表单元素和 Model 中数据的双向数据绑定 -->
    <!-- 注意: v-model 只能运用在 表单元素中 -->
    <!-- input(radio, text, address, email....)   select    checkbox   textarea   -->
    <input type="text" v-model="msg">
  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
     
     
      el: '#app',
      data: {
     
     
        msg: 'CSDN棒棒!'
      },
      methods: {
     
     
      }
    });
  </script>

效果展示
在这里插入图片描述
从效果展示可以看出v-model进行了双向绑定,

3 vue中样式

3.1 vue中样式-class

  <style>
    .red {
     
     
      color: red;
    }

    .thin {
     
     
      font-weight: 200;
    }

    .italic {
     
     
      font-style: italic;
    }

    .active {
     
     
      letter-spacing: 0.5em;
    }
  </style>
  
  <div id="app">
     <h1 class="red thin">vue样式学习</h1>

    <!-- 第一种使用方式,直接传递一个数组,注意: 这里的 class 需要使用  v-bind 做数据绑定 -->
     <h1 :class="['thin', 'italic']">vue样式学习</h1>

    <!-- 在数组中使用三元表达式 -->
     <h1 :class="['thin', 'italic', flag?'active':'']">vue样式学习</h1>

    <!-- 在数组中使用 对象来代替三元表达式,提高代码的可读性 -->
     <h1 :class="['thin', 'italic', {
     
     'active':flag} ]">vue样式学习</h1>

    <!-- 在为 class 使用 v-bind 绑定 对象的时候,对象的属性是类名,由于 对象的属性可带引号,也可不带引号,所以 这里我没写引号;  属性的值 是一个标识符 -->
    <h1 :class="classObj">vue样式学习</h1>


  </div>

  <script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
     
     
      el: '#app',
      data: {
     
     
        flag: true,
        classObj: {
     
      red: true, thin: true, italic: false, active: false }
      },
      methods: {
     
     }
    });
  </script>

效果展示
在这里插入图片描述

3.2 vue中样式-style

<div id="app">
    <!--默认方式-->
    <h2 :style="{
       
       color: 'red', 'font-weight': 200}">vue中样式-style</h2>
    <!--vue单个绑定-->
    <h2 :style="styleObj1">vue中样式-style</h2>
    <!--vue绑定数组-->
    <h2 :style="[ styleObj1, styleObj2 ]">vue中样式-style</h2>
</div>

<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
     
     
        el: '#app',
        data: {
     
     
            styleObj1: {
     
     color: 'red', 'font-weight': 200},
            styleObj2: {
     
     'font-style': 'italic'}
        },
        methods: {
     
     }
    });
</script>

效果展示
在这里插入图片描述
下一章:Vue基础教程–循环分支指令(二)

猜你喜欢

转载自blog.csdn.net/u011581852/article/details/114850635