VUE基础

VUE基础

  • Vue基础
    • 数据绑定
    • 过滤器
    • 指令
    • 计算属性
      • 计算属性的getter、setter方法
      • 计算属性扩展
      • 计算属性缓存
    • v-bind
      • 绑定class
        • 使用对象语法绑定class:
        • 使用数组语法绑定class
      • 绑定内联样式
        • 使用数组语法绑定多个样式
    • 内置指令
      • v-cloak
      • v-pre
      • v-once
      • v-if、v-else-if、v-else
      • v-for
        • v-for迭代整数
        • 更新数组触发数据改变的方法
      • v-on
    • v-model
    • 组件
      • 挂载组件
      • 通过props传递数据:
      • 子组件向父组件传值
      • 使用v-model和$emit传值
    • 中央事件总线
      • 父(\$parent)链传递数据
      • 子组件索引
      • slot插槽
      • 具名slot
      • 使用component标签挂载模板
      • $nextTick
    • 自定义指令
    • 虚拟dom
    • vue-router
      • 安装vue-router
      • 配置vue-router
    • 配置跳转
      • 方式一,router-link
      • 方式二,api跳转
      • router钩子函数
        • beforeEach
        • afterEach
    • vuex
      • 安装vuex
      • 配置vuex
      • 使用vuex,创建数据
        • 获取vuex中的数据
      • 使用mutations修改states的数据
      • commit接收对象
      • getters
      • 异步操作数据使用actions
      • modules状态区分
    • 中央事件总线vue-bus

Vue基础

数据绑定

通过{{}}可以与vue中data中的数据绑定。如果不想使用{{}}可以使用v-pre取消{{}}数据绑定。


<html lang="en">
<head>
    <title>Documenttitle>
head>
<body>
    <id id="app">
        <span >{{ a }}span>
        <span v-pre>{{a}}span>
    id>
    
    <script src="./js/vue.min.js">script>
    <script>
       let vue = new Vue({
           el: "#app",
           data: {
               a: '百度'
           },
           created() {
               console.log(this);
               console.log(this.a);
               console.log(this.$el);
               // vue数据实例创建完成,数据生成
           },
           mounted() {
               console.log(this);
               console.log(this.$el);
               // 挂载el,与dom关联
           }
           
       })
    script>
body>
html>

使用v-html输出html内容。

<id id="app">
	<span >{{ a }}span>
    <span v-pre>{{a}}span>
    <span v-html='a'>span>
id>

<script src="./js/vue.min.js">script>
<script>
   let vue = new Vue({
       el: "#app",
       data: {
           a: '百度'
       }
   })
script>

过滤器

filters属性加上|操作符实现过滤:

	<id id="app">
		
       {{ name | formartName}}
    id>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: "#app",
           data: {
               name: 'zs'
           },
           // 在filters中使用过滤器方法
           filters: {
               formartName(value) { // value就是需要过滤的数据
                    return "@_" + value + "_@";
               }
           }
       })
    script>

可以指定使用多个过滤器,也可以给过滤器传递参数:

	<id id="app">
        可以使用多个过滤器,并且还能给过滤器传递参数
       {{ name | formartName | formartName1('*')}}
    id>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: "#app",
           data: {
               name: 'zs'
           },
           filters: {
               formartName(value) { // value就是需要过滤的数据
                    return "@_" + value + "_@";
               },
               formartName1(value, param) {
                    return value + '->' + param;
               }
           }
       })
    script>

指令

使用v-show,如果为false时,只是设置了对应的元素的display属性为none:

	<id id="app">
       <p v-show="isShow">v-show的使用p>
    id>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               isShow: true
           }
       })
    script>

v-bind作数据绑定,可以为元素动态绑定一个属性。

	<id id="app">
		为p标签绑定了一个name属性,name属性的值就是data数据中text对应的值
       <p v-bind:name='text' v-show="isShow">v-show的使用p>
    id>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               isShow: true,
               text: '_text'
           }
       })
    script>

v-on指令,可以用来监听事件,其后接一个methods中定义的方法或者一个表达式。

	 <id id="app">
       <p v-bind:name='text' v-show="isShow" v-on:click="isShow = false">v-show的使用p>
    id>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               isShow: true,
               text: '_text'
           }
       })
    script>

计算属性

computed时计算属性,计算属性也是一个属性,类似于data中的数据,计算属性是一个函数,计算属性的值是函数的返回值。

	<id id="app">
       {{ fullName }}
    </id>
    
    <script src="./js/vue.min.js"></script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               firstName: 'Jhon',
               lastName: 'Cena'
           },
           computed: {
               fullName() {
                   return this.firstName + " " + this.lastName;
               }
           }
       })
    </script>

计算属性的getter、setter方法

计算属性有getter和setter方法,分别用于读取和设置计算属性的值。

	<id id="app">
       {{ fullName }}
    id>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               firstName: 'Jhon',
               lastName: 'Cena'
           },
           computed: {
               fullName: {
                   get() {
                       return this.firstName + " " + this.lastName;
                   },
                   set(value) {
                        let vs = value.split(' ');
                        this.firstName = "*" + vs[0];
                        this.lastName = vs[1];
                   }
               }
           }
       })
       app.fullName = 'zhang san';
    script>

计算属性是依赖其他属性的,只要其他属性发生改变,计算属性就会跟着发生变化。setter属性可以接收一个参数,这个参数接收了并不是一定能改变计算属性的值,而是根据参数,去改变对应的计算属性依赖的值,依赖的值改变,getter方法会返回对应格式的数据。

计算属性扩展

计算属性可以依赖其他计算属性,计算属性也可以依赖其他实例数据,这里演示计算属性依赖其他实例数据。

	<div id="app1">
        {{ msg }}
    div>
    <div id="app2">
        {{message}}
    div>
    
    
    <script src="./js/vue.min.js">script>
    <script>
       let app1 = new Vue({
           el: '#app1',
           data: {
               msg: 'message'
           }
       });
       let app2 = new Vue({
           el: '#app2',
           computed: {
               message() {
                   return app1.msg.split('').reverse().join('');
               }
           }
       })
       app1.msg = 'hello world!';
       
    script>

计算属性缓存

计算属性(computed)类似于方法(methods),但是方法每次调用都会被执行,而计算属性则不同,只有在计算属性所依赖的数据发生改变时才会执行。

	<div id="app1">
		计算属性是一个属性,可以直接使用,methods是方法,需要调用
        {{ cTime }},<br/> {{ mTime() }}
    </div>
  
    <script src="./js/vue.min.js"></script>
    <script>
       let app1 = new Vue({
           el: '#app1',
           data: {
               data: new Date()
           },
           computed: {
                cTime() {
                    return this.data + " --- ";
                }
           },
           methods: {
               mTime() {
                   return new Date();
               }
           }
       });

v-bind

绑定class

使用对象语法绑定class:

 	<div id="app">
        <span :class="{ 'red': isRed, 'error': isError}">这段话的颜色span>
    div>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               isRed: true,
               isError: true,
               active: 'active',
               primary: 'primary'
           }
       })
    script>

这段话的颜色,这里为class绑定一个对象,对象的属性名将作为class属性的值,当且仅当对象属性的值为true时,才会被应用。

使用数组语法绑定class

使用数组语法,可以嵌套对象语法。

	<div id="app">
        <span :class="[{ 'red': isRed, 'error': isError}, active, primary]">这段话的颜色span>
    div>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               isRed: true,
               isError: true,
               active: 'active',
               primary: 'primary'
           }
       })
    script>

要绑定多个class属性需要使用对象语法或者数组语法,如果都不使用,而是直接使用数据,最多只能有一个数据
错误写法:

<span :class="active primary">这段话的颜色span>

正确写法(只能有一个):

<span :class="active">这段话的颜色span>

绑定内联样式

对象语法,与绑定class不同的是,对象属性作为内联样式属性,数据的值作为样式的值,而不是根据true和false来确定应用谁

	<div id="app">
        <span :style="{'color': red, 'fontSize': fontSize + 'px'}">这段话的颜色span>
    div>
    
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               red: 'red',
               fontSize: 20
           }
       })
    script>

使用数组语法绑定多个样式

	<div id="app">
        <span :style="[color, font]">这段话的颜色</span>
    </div>
    
    <script src="./js/vue.min.js"></script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               color: {
                   color: 'red',
                   background: 'green'
               },
               font: {
                   fontSize: 20 + 'px'
               }
           }
       })
    </script>

内置指令

v-cloak

v-cloak的作用:如果网速较慢等情况下,数据加载较慢,{{data}}可能会直接显示在页面上,而v-cloak的作用就是阻止这种情况的发生。使用v-cloak时需要配合下面css样式:

[v-cloak] {
            display: none;
        }
	<div id="app">
        <span v-cloak>{{ msg }}span>
    div>
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               msg: 'message'
           }
       })
    script>

v-pre

v-pre的作用:{{data}}是取数据,而有时候我们需要原样输出,即{{}}不具备任何功能,这是就可以使用v-pre

	<div id="app">
        <span v-pre>{{ msg }}span>
    div>
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               msg: 'message'
           }
       })
    script>

v-once

使用v-once,数据只被渲染一次,之后数据发生变化使用了v-once的数据也不会被渲染

 	<div id="app" @click="changeMsg">
        <span>{{ msg }}span><br/>
        <span v-once>{{ msg }}span>
    div>
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               msg: 'message'
           },
           methods: {
               changeMsg() {
                   this.msg = this.msg.split('').reverse().join('');
               }
           }
       })

v-if、v-else-if、v-else

v-if和v-show的区别是,v-if不会加载html标签,v-show时设置css样式dispaly为none,v-show多用于频繁操作的场景。

	<div id="app">
        <span v-if='status == 1'>1span>
        <span v-else-if='status == 2'>2span>
        <span v-else-if='status == 3'>3span>
        <span v-else>4span>
    div>
    <script src="./js/vue.min.js">script>
    <script>
       let app = new Vue({
           el: '#app',
           data: {
               status: 3
           }
       })
    script>

可以使用