Vue成员与指令介绍

一、Vue介绍

1、什么是vue

通过对框架的了解与运用程度,来决定其在整个项目中的应用范围,
可以独立完成前后端分离式web项目的渐进式JavaScript框架

2、为什么要学vue

三大主流框架之一:Angular React Vue
先进的前端设计模式:MVVM
可以完全脱离服务器端,以前端代码复用的方式渲染整个页面:组件化开发

3、vue特点(优点)

单页面web应用:高效
数据驱动:从数据出发,不是从DOM出发
数据的双向绑定:数据是具有监听机制
虚拟DOM:页面缓存

二、Vue实例成员

使用:
    下载vue.js:https://vuejs.org/js/vue.js
    在要使用vue的html页面通过script标签引入
    在html中书写挂载点的页面结构,用id表示
    在自定义的script标签实例化Vue对象,传入一个大字典
    在字典中通过 el与挂载点页面结构绑定,data为其通过数据

包括:
    el:实例
    data:数据
    methods:方法
    computed:计算
    watch:监听
    delimiters:分隔符

1、成员之el(挂载点)和data(数据)

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>vue初识</title>

</head>
<body>

    <div id="main">
        // {{ vue变量 }} 插值表达式
        <h1>{{ msg_h1 }}</h1>
        <h2>{{ msg_h2 }}</h2>
    </div>

</body>

<script src="js/vue.js"></script>

<script>
    // 控制两个实例,通过大标签包含h1和h2
    new Vue({
        el: '#main', // 挂载点
        data: {  // 为挂载点的页面结构提高数据
            msg_h1: 'h1的内容',
            msg_h2: 'h2的内容',
        }
    })

</script>
</html>
View Code

2、成员之methods:方法

操作简单事件
操作简单样式
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>

<div id="app">
    <p v-on:click="btnClick" v-bind:style="v_style">点击文字颜色变为绿色</p>
</div>
</body>

<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            v_style: {
                color: 'block'
            }
        },
        methods: {
            btnClick: function () {
                this.v_style.color = 'green'
            }
        }
    })
</script>
</html>

 3、成员之computed:计算

  监听方法内所有的变量,返回值给绑定的变量,该变量无需在data中声明

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    <p>
        姓:<input type="text" v-model="first_name">
        名:<input type="text" v-model="last_name">
    </p>
    <p>姓名:<b>{{ full_name }}</b></p>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            first_name: '',
            last_name: '',
        },
        computed: {
            // 1.在computed中定义的变量的值等于绑定的函数的返回值
            // 2.绑定的函数中出现的所有vue变量都会被监听
            full_name: function () {
                // this代表该vue实例
                return this.first_name + this.last_name
            }
        }
    })
</script>
</html>
View Code

4、成员之watch:监听

  监听绑定的变量,绑定的变量必须在data中声明

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    <p>姓名:<input type="text" v-model="full_name"></p>
    <p>
        姓:<b>{{ first_name }}</b>
        名:<b>{{ last_name }}</b>
    </p>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            full_name: '',
            first_name: '',
            last_name: ''
        },
        watch: {
            full_name: function () {
                let res = this.full_name.split('');
                this.first_name = res[0];
                this.last_name = res[1];
            }
        }
    })
</script>
</html>
View Code

5、delimiters:分隔符

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    ${ msg }
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            msg: '123'
        },
        delimiters: ['${', '}']
    })
</script>
</html>
View Code

三、Vue指令

1、文本指令

  v-text,v-html,v-once

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    <!--插值表达式就是v-text的简写-->
    <p>{{ msg1 }}</p>
    <p v-text="msg2"></p>
     <!--可以解析html标签 -->
    <p v-html="msg3"></p>
    <!-- 必须赋初值,渲染的结果永远不会发生改变 -->
    <p v-once="msg3"  v-on:mouseover="action">{{ msg3 }}</p>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            msg1: '**msg1**',
            msg2: '<b>**msg2**</b>',
            msg3: '<b>**msg3**</b>',
        },
        methods: {
            action: function () {
                // var msg = this.$data.msg4;
                this.msg3 = '<i>**new msg3**</i>';  // 把msg3由粗体改为斜体
            }
        }
    })
</script>
</html>
View Code

2、事件指令

  v-on:事件名="函数名" 可以简写为:@事件名="函数名"

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    <!-- v-on:事件名="函数名"  可以简写为 @事件名="函数名"(v-on: => @)-->
    <p v-on:click="action1">{{ msgs[0] }}</p>
    <p @click="action2">{{ msgs[1] }}</p>

    <!--事件的传参-->
    <ul>
        <li @click="liAction(100)">列表项1</li>
        <li @click="liAction(200)">列表项2</li>
        <li @click="liAction(300)">列表项3</li>
    </ul>

    <!--鼠标事件的对象,直接写函数名,默认将鼠标事件对象传入-->
    <div @click="func1">func1</div>
    <!-- 鼠标事件的对象:一旦添加(),就必须手动传参,$event就代表鼠标事件对象 -->
    <div @click="func2($event, 'abc')">func2</div>

</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            msgs:['111', '222']

        },
        methods: {
            action1: function () {
                alert(this.msg[0])
            },
            action2: function () {
                alert(this.msg[1])
            },
            liAction: function (num, msg) {
                 console.log(num, msg)
            },
            func1:function (ev) {
                console.log(ev)
            },
            func2:function (ev, msg) {
                console.log(ev);
                console.log(msg)
            }
        }
    })
</script>
</html>
View Code

3、属性指令

  v-bind:属性名='变量' (v-bind可以简写为 :)

  用vue绑定属性,将属性内容交给vue处理

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
    <style>
        .rDiv {
            width: 100px;
            height: 100px;
            background-color: red;
        }
        .gDiv {
            width: 500px;
            height: 500px;
            background-color: green;
        }
        .br {
            border-radius: 50%;
        }
    </style>
</head>
<body>
<div id="app">
    <!--属性指令:用vue绑定属性,将属性内容交给vue处理-->
    <!--语法:v-bind:属性名='变量' (v-bind可以简写为 :)-->
    <p class="" style="" v-bind:owen="oo" :jason="jj"></p>

    <!--class属性-->
    <p :class="c1" @click="action1"></p>  <!--单类名-->
    <p :class="[c1, c2]" ></p>  <!--双类名-->
    <p :class="[c1, 'br']" ></p>  <!--'br' 固定写死的数据,不再是变量-->

    <!--style属性-->
    <!-- 一个变量:该变量值为{},{}内部完成一个个属性的设置 -->
    <p class="gDiv" :style="s1">123</p>
    <!-- 一个{}:{}内一个个属性有一个个变量单独控制 -->
    <p class="gDiv" :style="{fontSize:f, color:c}">456</p>

</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            oo: 'Owen',
            jj: 'Jason',
            c1: 'rDiv',
            c2: 'br',
            s1: {
                fontSize: '100px',
                color: 'pink'
            },
            f: '200px',
            c: 'orange'
        },
        methods: {
            action1: function () {
                if (this.c1 == 'rDiv'){
                    this.c1 = 'gDiv'
                }else {
                    this.c1 = 'rDiv'
                }
            }
        }
    })
</script>
</html>
View Code

4、表单指令

  v-model="变量"

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    <!--表单指令:v-model="变量"-->
    <form action="">
        <!--下面两个input框双向绑定-->
        <p><input type="text" v-model="val"></p>
        <p><input type="text" v-model="val"></p>
        <!-- 单选框 v-model绑定的变量是单选框中某一个input的value -->
        <p>
            男: <input v-model="r_val" value="male" type="radio" name="sex">
            女: <input v-model="r_val" value="female" type="radio" name="sex">
        </p>

        <!-- 复选框 v-model绑定的变量是一个列表,列表存放0到任一个复选框的value  -->
        <p>
            男: <input v-model="c_val" value="m" type="checkbox" name="h">
            女: <input v-model="c_val" value="f" type="checkbox" name="h">
            哇塞: <input v-model="c_val" value="mf" type="checkbox" name="h">
        </p>
        <button type="submit">提交</button>
    </form>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            val: '',
            r_val: 'female',
            c_val: []
        }
    })
</script>
</html>
View Code

5、条件指令

  v-show, v-if, v-else-if, v-else 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    <p v-if="r1" key="p_r1">if条件</p>
    <p v-show="r2">show条件</p>
    {{ num + 1 - 1 * 2 + '好的'}}

    <ul>
        <!--v-else会默认与v-if等有条件的分支绑定,当v-if成立的时候,就不会执行下面的-->
        <!--v-else-if必须由条件才和有条件v-if分支绑定,当v-else-if成立时就不会执行下面的-->
        <!--前面两者都不成立时才会执行v-else-->
        <li v-if="tag==1">111</li>
        <li v-else-if="tag==2">222</li>
        <li v-else>333</li>
    </ul>

    <ul>
        <li @click="action('a')">a</li>
        <li @click="action('b')">b</li>
        <li @click="action('c')">c</li>
    </ul>
    <ul>
        <li v-show="flag=='a'">aaa</li>
        <li v-show="flag=='b'">bbb</li>
        <li v-show="flag=='c'">ccc</li>
    </ul>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            num: 10,
            r1: true,
            r2: false,
            tag: 2,
            flag: 'a'
        },
        methods: {
            action: function (s) {
                this.flag = s
            }
        }
    })
</script>
</html>
View Code

6、循环指令

  v-for

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
<div id="app">
    <!-- 循环指令:v-for -->
    <!--列表:注意值在前面,索引在后面-->
    <ul>
        <li v-for="(num, index) in nums">{{ num }}{{ index }}</li>
    </ul>

    <!--字典-->
    <ul>
        <li v-for="(v, k, i) in info">{{ v }}{{ k }}{{ i }}</li>
    </ul>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            nums: [5, 3, 2, 1, 4 ,6],
            info: {
                'name': 'jason',
                'age': 28,
                'gender': 'male'
            }
        }
    })
</script>
</html>
View Code

7、评论案例

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>模板</title>
    <style>
        span {
            margin-left: 100px;
            cursor: pointer;
            color: green;
        }
        span:hover {
            color: red;
        }
    </style>
</head>
<body>
<div id="app">
    <p>
        <input type="text" v-model="val">
        <button @click="add">评论</button>
    </p>

    <ul>
        <li v-for="(info, i) in infos">
            {{ info }}
            <span @click="del(i)">x</span>
        </li>
    </ul>

</div>
</body>
<script src="js/vue.js"></script>
<script>
    l = [1, 2, 3];
    // splice: 从哪个索引开始 操作的位数 操作的结果
    l.splice(0, 0, 0, 1, 2, 3);
    console.log(l)
</script>
<script>
    new Vue({
        el: '#app',
        data: {
            infos: [],
            val: ''
        },
        methods: {
            del: function (i) {
                // splice: 从哪个索引开始 操作的位数 操作的结果(可变长)
                this.infos.splice(i, 1)
            },
            add: function () {
                let val = this.val;
                if (val){
                    this.infos.splice(0, 0, val);
                    this.val = ''
                }
            }
        }
    })
</script>
</html>
View Code

原文地址:https://www.cnblogs.com/zhangguosheng1121/p/11099072.html