【转载】Vue 基础

转自:https://blog.csdn.net/qq_23079469/article/details/112461253

Vue 常用属性

创建 Vue

var vm = new Vue({})

el

唯一根标签

  <div id="app">
    <p>{{name}}</p>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        name: '定义初始数据'
      }
    })
  </script>

data 初始数据

  <div id="app">
    <p>{{name}}</p>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        name: '定义初始数据'
      }
    })
  console.log(vm.$data.name)
  console.log(vm.name)
  </script>
  • 在 Vue 中想要定义变量就可以定义到 data 中
  • 访问数据可以通过 vm.$data.name 这样来访问数据,
  • 另外其实 Vue 的实例也代理了 data 对应,所以也可以console.log(vm.name)直接访问。
  • 如果想在页面上显示 data 里的数据, 最简单的就是用 “{{ }}” 绑定到页面。

methods 定义方法

 <div id="app">
    <!-- 为button按钮绑定click事件 -->
    <button @click="showInfo">请单击</button>
    <p>{{msg}}</p>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        msg: ''
      },
      methods: {
          // 定义事件处理方法showInfo
        showInfo () {
          this.msg = '触发单击事件'
        }
      }
    })
  </script>
  • 如果要定义方法就把方法放到methods里。
  • 这里在页面通过 @click=“showInfo” 让按钮的点击绑定了showInfo事件。
  • 当data数据改变时, 页面上所绑定的数据页面也会实时的进行改变。

computed 计算属性

当需要一些数据随着其他数据的改变而改变时就需要使用到 computed。

 <div id="app">
    <p>总价格:{{totalPrice}}</p>
    <p>单价:{{price}}</p>
    <p>数量:{{num}}</p>
    <div>
      <button @click="num == 0 ? 0 : num--">减少数量</button>
      <button @click="num++">增加数量</button>
    </div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        price: 20,
        num: 0
      },
      computed: {
        // 总价格totalPrice
        totalPrice () {
          return this.price * this.num
        }
      }
    })
  </script>

watch 计算属性

当数据发生变化时,触发事件使用 watch。

  <div id="app">
    <!-- input中的v-model用于在表单控件元素上创建双向数据绑定 -->
    <input type="text" v-model="cityName">
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        cityName: 'shanghai'
      },
      // 使用watch监听cityName变化
      watch: {
        cityName (newName, oldName) {
          console.log(newName, oldName)
        }
      }
    })
  </script>

computed 和 watch 区别

  • computed 是计算属性;watch 是监听一个值的变化执行对应的回调
  • computed 函数所依赖的属性不变的时候会调用缓存;watch 每次监听的值发生变化时候都会调用回调
  • computed 必须有 return,watch 可以没有。
  • computed 当一个属性受多个属性影响的时候使用;例如购物车商品结算;watch 当一条数据影响多条数据时使用,例如搜索框。
  • computed 不支持异步,watch 支持。

filters 过滤器

有两种方式使用,第一种是在插值表达式中使用,另一种是 v-bind。

  <div id="app">
    <div>{{message | toUpcase}}</div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        message: 'helloworld'
      },
      filters: {
        // 将 helloworld 转换为 HELLOWORLD
        toUpcase (value) {
          return value ? value.toUpperCase() : ''
        }
      }
    })
  </script>
  <div id="app">
    <div v-bind:id="dataId | formatId">helloworld</div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        dataId: 'dff1'
      },
      filters: {
        formatId(value) {
          // 字符串处理
          return value ? value.charAt(1) + value.indexOf('d') : ''
        }
      }
    })
  </script>

Vue 数据绑定

绑定内链样式

通过 v-bind 将样式绑定给 DOM

<div v-bind:style="{backgroundColor:pink,width:width,height:height}">
  <!-- 绑定样式对象 -->
  <div v-bind:style="myDiv"></div>
</div>

绑定样式类

 <div id="app">
    <div v-bind:class="{box}">我是box
      <div v-bind:class="{inner}">我是inner1</div>
      <div v-bind:class="{inner}">我是inner2</div>
    </div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        box: 'box',
        inner: 'inner'
      }
    })
  </script>

Vue 内置指令

v-model

绑定的值任意一方改变,所有都改变。

  <div id="app">
    <input type="text"  v-model="msg">
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'v-model指令'
      }
    })
  </script>

v-text

在 DOM 原始内部插入文本内容时使用。

  <div id="app">
    <p v-text="msg"></p>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        msg: '我是v-text'
      }
    })
  </script>

v-html

<div id="app">
    <div v-html="msg"></div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        msg: '<h2>我是v-html</h2>'
      }
    })
  </script>

v-bind

和 v-model 一样是用来绑定数据的,但是这个数据改变时,绑定的数据并不会一起改变, 两个数据是分离的对象。

<div id="app">
    <input v-bind:value="msg">
</div>
<script>
    var vm = new Vue({
      el: '#app',
      data: {
        msg: '我是v-bind'
      }
    })
</script>

v-model 与 v-bind 区别

  • v-bind 是单向绑定,用来绑定数据和属性以及表达式,数据只能从 data 流向页面。
  • v-model 是双向绑定,数据能从 data 流向页面,也能从页面流向 data。
  • v-bind 可以给任何属性赋值,v-model 只能给表单类,也就是具有 value 属性的元素进行数据双向绑定,如 text、radio、checkbox、selected。
    这个原因也很好理解,从页面流向 data,v-model 是捕获用户的输入值,如果没有 value,捕获不了,所以这个流向没有意义,v-model 就是收集 value 值。

v-on

对各种事件进行绑定。

  <div id="app">
    <p>{{msg}}</p>
    <button v-on:click="showInfo">请单击</button>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {msg: '请单击按钮查看内容'},
      methods: {
        showInfo () {
          this.msg = '我是v-on指令'
        }
      }
    })
  </script>

v-for

常用于在页面上循环显示列表。

  <div id="app">
    <div v-for="(item,key) in list" data-id="key">
      索引是:{{key}},元素内容是:{{item}}
    </div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        list: [1, 2, 3]
      }
    })
  </script>

v-if 和 v-show

两个指令都是用于元素的动态显示或隐藏。
v-if 是直接对原始元素进行删除和重建;v-show 是使用 display 进行隐藏。所以性能上来说 v-show 的性能更好。

  <div id="app">
    <div v-if="isShow" style="background-color:#ccc;">我是v-if</div>
    <button @click="isShow=!isShow">显示/隐藏</button>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        isShow: true
      }
    })
  </script>

Vue 事件

事件监听

在触发事件时执行 JavaScript 代码

v-on 可以直接执行 JavaScript 代码。

<div id="app">
    <button v-on:click="count+=Math.random()">随机数</button>
    <p>自动生成的随机数是{{count}}</p>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        count: 0
      }
    })
  </script>

使用键盘修饰符监听按键

<div id="app">
    <input type="text" v-on:keyup.enter="submit">
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      methods: {
        submit () {
          console.log('表单提交')
        }
      }
    })
  </script>

事件修饰符

.stop 阻止事件冒泡

以下代码默认是会触发两个事件的。使用 .stop 可以阻止父级原始事件的触发。

  <div id="app">
    <div v-on:click="doParent">
      <button v-on:click="doThis">事件冒泡</button>
      <button v-on:click.stop="doThis">阻止事件冒泡</button>
    </div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      methods: { 
        doParent () {
          console.log('我是父元素单击事件')
        },
        doThis () {
          console.log('我是被单击元素事件')
        }
      }
    })
  </script>

.prevent 阻止默认事件行为

有些 html 具有自身的特性,比如 a 标签,点击时会自动跳转,假如自动跳转与事件发生冲突,可以使用 .prevent 阻止 a 标签的默认行为。

  <div id="app">
    <a href="https://www.baidu.com" v-on:click.prevent>阻止默认行为</a>
    <a href="https://www.baidu.com">不阻止默认行为</a>
  </div>
  <script>
    var vm = new Vue({
      el: '#app'
    })
  </script>

.capture 事件捕获

默认的冒泡顺序是先执行内部事件再执行外部事件,而事件捕获是相反的。 假如想先执行外部事件,则可以加上 .capture,让其绑定的是事件捕获。

<div id="app">
    <div v-on:click.capture="doParent">
      <button v-on:click="doThis">事件捕获</button>
    </div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      methods: {
        doParent () {
          console.log('我是父元素的单击事件')
        },
        doThis () {
          console.log('我是当前元素的单击事件')
        }
      }
    })
  </script>

.self 自身触发

点击 b 区域,触发 doThis 事件方法执行,点击 d 区域时doThis 和 doParent 会以此执行。

<div id="app">
    <div class="Odiv1" v-on:click.self="doParent">a
      <div class="Odiv2" v-on:click="doThis">b</div>
    </div>
    <div class="Odiv1" v-on:click="doParent">c
      <div class="Odiv2" v-on:click.self="doThis">d</div>
    </div>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      methods: { 
        doParent () {
          console.log('我是父元素的单击事件')
        },
        doThis () {
          console.log('我是当前元素的单击事件')
        }
      }
    })
  </script>

转自:https://www.ddpool.cn/article/53287.html
.self 可以理解为跳过冒泡事件和捕获事件,只有直接作用在该元素上的事件才可以执行。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>self</title>
 <script src="vue.js"></script>
 <!--'''''''''''''''''''请自行引入vue.js-->
</head>
<style type="text/css">
 * {
  margin: 0 auto;
  text-align:center;
  line-height: 40px;
 }
 div {
  width: 100px;
 }
 #obj1 {
  background: deeppink;
 }
 #obj2 {
  background: pink;
 }
 #obj3 {
  background: hotpink;
 }
 #obj4 {
   background: #ff4225;
  }
</style>
<script src="vue.js"></script>
</head>
<body>
<!--点击obj4的时候会分别显示: obj4、 obj3、 obj1;
.self会监视事件是否是直接作用到obj2上,若不是,则冒泡跳过该元素,-->
<div id="content">
 <div id="obj1" v-on:click="doc">
  obj1
  <div id="obj2" v-on:click.self="doc">
   obj2
   <!--只有点击obj2才可以出发其点击事件。-->
   <div id="obj3" v-on:click="doc">
    obj3
    <div id="obj4" v-on:click="doc">
     obj4
    </div>
   </div>
  </div>
 </div>
</div>
<script type="text/javascript">
 var content = new Vue({
  el: "#content",
  data: {
   id: ''
  },
  methods: {
   doc: function () {
    this.id= event.currentTarget.id;
    alert(this.id)
   }
  }
 })
</script>
</body>
</html>

.once 只触发一次

当执行事件执行只一次时,使用 .once。

  <div id="app">
    <button v-on:click.once="doThis">只执行一次</button>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      methods: {
        doThis () {
          console.log('我是当前元素的单击事件且只执行一次')
        }
      }
    })
  </script>
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注