内容绑定,事件绑定

v-text

设置标签文本值(textContent)

  • 会将标签文本内容全部替换
  • 支持字符串拼接
<div id="app">
  <h2 v-text="message"></h2>
  <h2 v-text="message">这句话会被覆盖</h2>
  <h2 v-text="message + '!'"></h2>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      message: "Hello Vue.js"
    }
  })
</script>

v-html

设置标签文本值,添加子标签(innerHtml)

<div id="app">
  <h2 v-html="message"></h2>
  <p v-html="a"></p>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      message: "Hello Vue.js",
      a: "<a href='https://www.baidu.com'>百度</a>"
    }
  })
</script>

v-on 基础

为元素绑定事件(onclick、onmonseenter、ondblclick)

<div id="app">
  <input type="button" v-on:click="onClick" />
  <input type="button" v-on:monseenter="onMonseenter" />
  <input type="button" v-on:dblclick="onDblclick" />
  <input type="button" @dblclick="双击事件" />  <!-- 用 @ 符号代替 v-on: -->
  <h3 @click="changeEle">{{ val }}</h3>  <!-- 更改元素属性 -->
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      val: '番茄鸡蛋',
    },
    methods: {
      onClick: function () {
        alert('这是一个点击事件')
      },
      onMonseenter: function () {
        alert('这是一个鼠标移入事件')
      },
      onDblclick: function () {
        alert('这是一个双击事件')
      },
      changeEle() {
        this.val += '好好吃!'
      },
    },
  })
</script>

计时器案例

<div id="app" style="display: flex;">
  <button style="width: 50px;" v-on:click='on_del'>-</button>
  <span style="width: 50px; text-align: center;">{{ number }}</span>
  <button style="width: 50px;" v-on:click='on_add'>+</button>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      number: 0,
    },
    methods: {
      on_add: function(){
        this.number +=1
      },
      on_del: function(){
        if (this.number <= 0){
          alert("不能再小了")
          return
        }
        this.number -=1
      }
    }
  })
</script>

显示切换,属性绑定

v-show

根据表达式的真假,切换元素的显示和隐藏(display)

<div id="app">
  <img src="https://cdn.wetest.qq.com/wetest-web-qq/static/img/add.2925520.png" v-show='isShow'>
  <input type="button" @click='show_this' value="show">
</div>

<script>
  new Vue({
    el: '#app',
    data:{
      isShow: true
    },
    methods:{
      show_this: function(){
        this.isShow = !this.isShow;
      }
    }
  })
</script>

v-if

根据表达式的真假,切换元素的显示和隐藏(操纵dom元素)

跟v-show的区别:

  • 二者都是用来 展示/隐藏元素的
  • v-show 通过控制标签的display属性来实现元素的 展示/隐藏
  • v-if 隐藏元素时,直接将元素从dom中删除
  • 频繁 显示/隐藏 的元素用v-show,反之用v-if
<div id="app">
  <p v-if='isShow'> 这是一个p标签 </p>
  <input type="button" value="show" @click='p_show'>
	<p v-if='age > 35'> 年纪有点大了 </p>       <!-- 表达式 -->
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      isShow: false,
      age: 40
    },
    methods: {
      p_show: function(){
        this.isShow = !this.isShow
      }
    }
  })
</script>

v-bind

设置元素的属性

<div id="app" style="display: flex;">
  <img v-bind:src="imgSrc"> <br>
  <img :src="imgSrc" alt="" :title="titleSrc" :class='{active:isActive}' @click='toActive'>
  <!-- :xxx 省略写法,{xxx:xxx} 对象表达式  -->
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      imgSrc: 'https://www.itheima.com/images/logo.png',
      titleSrc: '好看的壁纸',
      isActive: false,
    },
    methods:{
      toActive: function(){
        this.isActive = !this.isActive
      }
    }
  })
</script>

图片切换案例

<div id="app" style="display: flex">
  <button @click="prev" v-show="index!=0">上一张</button>
  <img :src="imgList[index]" alt="" />
  <button @click="next" v-show="index<imgList.length-1">下一张</button>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      imgList: [
        'https://th.wallhaven.cc/lg/y8/y8vlyk.jpg',
        'https://th.wallhaven.cc/lg/72/72rxqo.jpg',
        'https://th.wallhaven.cc/lg/e7/e7ek7k.jpg',
        'https://th.wallhaven.cc/lg/z8/z8odwg.jpg',
      ],
      index: 0,
    },
    methods: {
      prev: function () {
        this.index --
      },
      next: function () {
        this.index ++
      },
    },
  })
</script>

列表循环,表单元素绑定

v-for

根据数据生成列表结构

<div id="app" style="display: flex">
  <ul>
    <li v-for="item in arr">item: {{ item }}</li>  <!-- arr script中定义好的变量 -->
  </ul>
  <ul>
    <li v-for="(item,index) in arr">index: {{ index }} | {{ item }}</li> <!-- index-下标,item-值 -->
  </ul>
  <ul>
    <li v-for="(item,index) in arrObj">
      index: {{ index }} | {{ item.name }}:{{ item.age }} <!-- 拿字典值 -->
    </li>
  </ul>
  <button @click="addPerson">添加</button>
  <button @click="delPerson">删除</button>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      arr: [1, 2, 3, 4, 5],
      arrObj: [
        { name: 'Tom', age: 18 },
        { name: 'Jack', age: 19 },
        { name: 'Rose', age: 19 },
        { name: 'Jarry', age: 19 },
        { name: 'Talor', age: 19 },
      ],
    },
    methods: {
      addPerson: function () {
        this.arrObj.push({ name: '大头', age: 19 })  // push 向列表添加数据
      },
      delPerson: function () {
        this.arrObj.shift()  // shift 移除列表第一个元素
      },
    },
  })
</script>

v-on 补充

传参,事件修饰符等。https://cn.vuejs.org/v2/api/#v-on

<div id="app" style="display: flex">
  <input type="button" @click='doIt("over")' value="please talk something" />
  <input type="text" @keyup.enter='sayBye("LX", "Bye")' value="Bye" />  <!-- @keyup事件触发固定写法,@keyup.enter 限制点击回车按键时触发方法 -->
</div>

<script>
  new Vue({
    el: '#app',
    data: {},
    methods: {
      doIt: function (solve) {
        console.log('Nothing is impossible!')
        console.log('but ' + solve + '.')
      },
      sayBye: function (name, des) {
        console.log(name + ':' + des)
      },
    },
  })
</script>

v-model

设置、获取表单元素的值(双向数据绑定)

<div id="app">
  <input type="text" v-model="msg" @keyup.enter="getMsg" />
  <input type="button" @click="setMsg" value="set" />
  <h3>{{ msg }}</h3>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      msg: '给我一首歌的时间',
    },
    methods: {
      getMsg: function () {
        console.log(this.msg)
      },
      setMsg: function () {
        this.msg = '一滴泪的时间'
      },
    },
  })
</script>

记事本案例

<div id="app">
  <section>
    <header>
      <h1>记事本</h1>
      <!-- v-model、v-on 使用 -->
      <input v-model='input_value' @keyup.enter='add' placeholder="请输入任务">
    </header>
    <section>
      <ul class="todo-list">
        <!-- v-for 使用 -->
        <li v-for="(item, index) in list">
          <span>{{ index+1 }}: </span>
          <label>{{ item }}</label>
          <!-- v-on 使用 -->
          <button @click='del(index)'>删除</button>
        </li>
      </ul>
    </section>
    <footer>
      <span>
        <strong>{{ list.length }}</strong>
        items left
      </span>
      <button @click='clear'>clear</button>
    </footer>
  </section>
</div>

<script>
  new Vue({
    el: '#app',
    data: {
      list: ['吃饭', '睡觉', '敲代码'],
      input_value: "好好学习,天天向上",
    },
    methods: {
      add: function () {
        this.list.push(this.input_value)
      },
      del: function (index) {
        this.list.splice(index, 1); // splice根据索引删除列表元素,一次删一个
      },
      clear: function(){
        this.list = []
      }
    }
  })
</script>