VUE基础

VUE入门

VUE

核心概念,不让用户操作DOM元素,让程序员可以更多的关注业务逻辑!(能帮我们减少不必要的DOM操作,提高渲染效率,双向数据绑定)

MVVM

M是界面的数据 V就是前端界面 VM是一个调度者,调度M和V之间的数据交换

<!DOCTYPE html>
<html>
<head>
	<title>VUE入门</title>
	<script src="vue.js"></script>
</head>
<body>
	<div id="zx125"></div>
	<script type="text/javascript">
		new Vue({
			el:"#zx125",
			template:'<p>{{zx}}</p>',
			data:{
				zx:"HELLO VUE"
			}
		})
	</script>
</body>
</html>

渐进式

Vue可以根据开发者的实际需求来不断渐进,而不是一口气全部用上

挂载点

1.挂载点只检索页面中第一个匹配到的结果,所以挂载点一般都才有id选择器
2.html与body标签不可以作为挂载点

创建vue实例(new Vue)传进去的字典(对象)的key,称之为vue实例成员(变量)
访问实例成员,用 vue实例.$成员名, eg:app.$el

默认.取值,取得就是data里面的值
   console.log(zx.$data.zx);
       console.log(zx.zx);
$el为html的元素
    let zx = new Vue({
        el: '#app',
        data:{
            zx:'zx125'
        }
    });
    console.log(zx);
    console.log(zx.zx);
    console.log(zx.$el);
    console.log(zx.$data);
    console.log(zx.$data.zx);

vue事件

methods就是vue实例提供的事件函数,函数里面的this就是vue实例(注意是methods里面的this)

    let zx = new Vue({
        el: '#app',
        data:{
            zx:'zx125'
        },
        methods:{
            fn:function () {
                this.zx='点击'
            },
            fn1:function () {
                this.zx='移到button'
            },
            fn2:function () {
                this.zx='移出button'
            }
        }
    });

事件指令

事件可以简写成事件指令

v-on:事件名:"事件函数" = @事件名=“事件函数”

 <!--绑定的事件函数如果没有传递参数,默认传入 事件对象 -->
 <p @click="z1">1</p>

如果指定了参数,事件对象要要手动传入
 <p @click="z2(100)">2</p>
 
 手动传入
 <p @click="z3(100,$event)">3</p>
 
 z1:function(ev){
 console.log(ev)
 },
 z2:function(num,){
 console.log(num);
 },
 z3:function(num,ev){
 console.log(num);
 console.log(ev);
 },

文本指令

{{}},变量由data提供

{{msg}}
{{msg + "文本拼接"}}
{{msg[1]}} 索引取值
{{msg.slice(2,4)}}切片取值

<!-- v-text:将所有内容做文本渲染 -->
<p v-text="msg + '拼接内容'"></p>

<!-- v-html:可以解析html语法标签的文本 -->
<p v-text="'<b>' + msg + '</b>'"></p> = <b>文本信息</b>
<p v-html="'<b>' + msg + '</b>'"></p> = 加粗 文本信息

#注意这里使用的是反的单引号
<p v-text="`<b>${msg}</b>`"></p> = <b>文本信息</b>
<p v-html="`<b>${msg}</b>`"></p> = 加粗 文本信息

属性指令

1.标签

2.样式(style)

<div id="app">
		#属性指令:v-bind:属性名="变量",简写方式 :属性名="变量" 
        <div class="b1" id="b1" v-bind:title="title" :abc="xyz"></div>
        
        #属性指令操作 style 属性
        <div style="width: 200px;height: 200px;background-color: greenyellow"></div>
        
        #通常:变量值为字典
        <div :style="mys1"></div>
        
        
        
        了解:{中可以用多个变量控制多个属性细节} 
        <div :style="{width: w,height: '200px',backgroundColor: 'deeppink'}"></div>


        #重点:一般vue都是结合原生css来完成样式控制
        <!--<div :class="c1"></div>-->

        <!--class可以写两份,一份写死,一份有vue控制-->
        <div class="box1" :class="c2"></div>

        <!--{}控制类名,key为类名,key对应的值为bool类型,决定该类名是否起作用-->
        <div :class="{box2:true, circle:cable}" @mouseover="changeCable(1)" @mouseout="changeCable(0)"></div>


        <!--[]控制多个类名-->
        <div :class="[c3, c4]"></div>
    </div>

过滤器

可以对变量进行过滤,可以过滤多次该可以同时过滤多个变量,并传递变量

<div id="app">
    <p>{{ zx }}</p>
    <p>{{ msg }}</p>
    <button v-on:click="fn" v-on:mouseover="fn1" v-on:mouseout="fn2">按钮</button>
    <p>{{ wl | f1 }}</p>
    <p>{{ wl | f1 | f2}}</p>
    <p>{{ wl,zx| f3}}</p>
    <p>{{ wl,zx | f4(100,200) }}</p>
</div>

        filters:{
          f1(num){
              return num*2
          },
            f2(num){
              return num/99
            },
            f3(num1,num2){
              return num1+num2
            },
            f4(num1,num2,num3,num4){
              return num1+num2+num3+num4
            }
        },
        
198

2

99zx125

99zx125100200

表单指令

主要是关联表单的数据,如果是单选,多选的话关联表单的选中状态(通过标签的value来关联)

<div id="app">
	#普通表单
    <input type="text" v-model="zx1">
	#单选
    <input type="checkbox" name="agree" v-model="zx2">
	#复选
    <input type="checkbox" name="hobby" value="paly" v-model="zx3">
    <input type="checkbox" name="hobby" value="eat" v-model="zx3">
	#多项单选
    <input type="radio" name="sex" value="man" v-model="zx4">
    <input type="radio" name="sex" value="women" v-model="zx4">
</div>

<script>
    new Vue({
        el:'#app',
        data:{
            zx1:'我是数据',
            zx2:true,
            zx3:['eat','paly'],
            zx4:'man'
        }
    })
</script>

斗篷指令

其实就是防止,界面出现的时候,页面的模板出现还没有被渲染的模板语法,其实也可以把vue.js的引入放到顶上解决这个问题

<style>
    [v-cloak] {
    display: none;
    }
</style>

<div id="app" v-cloak>
	<p>{{ msg }}</p>
</div>

条件指令

注意

1.if和show的区别,为false,if标签是不会再前端渲染的,但是show的话,是在前端渲染的,只是样式为display:none,只是不显示而已

2.if和elseif,else联用的话,当上面有满足条件的的时候,就不会渲染下面分支的内容,当上面所有的分支都不满足,才会满足else分支而且else分支不需要条件的

<div id="app">
    <p v-if="false">我是if指令</p>
    <p v-show="false">我是show指令</p>

    <p v-if="true">我是if指令</p>
    <p v-show="true">我是show指令</p>

    <p v-if="zx == '1' ">我是if指令</p>
    <p v-show="zx === '1' ">我是show指令</p>
    
    <p v-if="zx === '1'">if分支</p>
    <p v-else-if="zx === '2'">elif分支1</p>
    <p v-else-if="zx === '3'">elif分支2</p>
    <p v-else>else分支</p>
</div>

    new Vue({
        el: '#app',
        data: {
            zx: '1',
        }
    })

案例

功能:点击显示不同的颜色块,点击的按钮显示点击的状态,刷新不重置(保存显示状态)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <style>
        .box {
            width: 400px;
            height: 200px;
        }

        .r {
            background-color: red
        }

        .y {
            background-color: yellow
        }

        .g {
            background-color: green
        }

        .action {
            background-color: pink;
        }
        span{
            width: 30px;
            height: 30px;
        }
    </style>
</head>
<body>
<div id="app">
    <p>
        <span @click="changeC('red')" :class="{action: c === 'red'}">红</span>
        <span @click="changeC('yellow')" :class="{action: c === 'yellow'}">黄</span>
        <span @click="changeC('green')" :class="{action: c === 'green'}">绿</span>
    </p>
    <div class="wrap">
        <div class="box r" v-if="c === 'red'"></div>
        <div class="box y" v-else-if="c === 'yellow'"></div>
        <div class="box g" v-else></div>
    </div>
</div>

</body>
<script>
    new Vue({
        el: '#app',
        data: {
            c: localStorage.c ? localStorage.c : 'red',
        },
        methods: {
            changeC(color) {
                this.c = color;
                // 每一次改变c的值,将值同步到前台数据库
                localStorage.c = color;  // 存
            }
        }
        })
</script>
</html>

解析

#action类,满足条件才有
<button @click="changeC('red')" :class="{action: c === 'red'}">红</button>

#浏览器的本地数据库,需要手动才能删除
localStorage

#每次点击先改变vue的c值,然后在本地保存一个c=color的值
this.c = color;
localStorage.c = color;  

#首先取本地存的c,如果c为空取红色
c: localStorage.c ? localStorage.c : 'red',

循环指令

就是循环拿数据,并且渲染界面

<div id="app">
	#字符串
    <p><span v-for="v in name">{{ v }}</span></p>
    <p><span v-for="(v,i) in name">{{ v }}{{ i }}</span></p>
	#对象数据
    <p><span v-for="v in zx">{{ v }}</span></p>
    <p><span v-for="(v,k) in zx">{{ v }}{{ k }}</span></p>
    <p><span v-for="(v,k,i) in zx">{{ v }}{{ k }}{{ i }}</span></p>
	#数组对象
    <div v-for="(peo,i) in student">
        <hr v-if="i != 0">
        <p><span v-for="(v,k,i) in peo">{{ v }}{{ k }}{{ i }}</span></p>
    </div>
</div>

new Vue({
        el: '#app',
        data: {
            name: '阿萨德',
            zx: {
                name: 'zx',
                age: 18,
                sex: 'man'
            },
            student: [
                {
                    name: 'zx',
                    age: 18,
                    sex: 'man'
                },
                {
                    name: 'wl',
                    age: 18,
                    sex: 'women'
                },
                {
                    name: 'zx125',
                    age: 18,
                    sex: 'man'
                }
            ]
        },
    })

案例

输入框提交,动态调加留言,点击留言可以删除

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <style>
    </style>
</head>
<body>
<div id="app">
    <input type="text" v-model="msg">
    <button @click="sub">添加留言</button>
    <ul>
        <li v-for="(v,i) in comments" @click="del(i)">{{ v }}</li>
    </ul>
</div>

</body>
<script>
    new Vue({
        el: '#app',
        data: {
            msg:'',
            comments:[]
        },
        methods:{
            sub(){
                if(this.msg){
                    //添加留言
                    this.comments.push(this.msg);
                    //添加后情况输入框
                    this.msg = '';
                }
            },
            del(i){
                this.comments.splice(i,1)
            }
        }
    })
</script>
</html>

解析

push是在数组后面插入数据
unshift是在数组前面插入数据

// 数组操作万能方法,可以完成增删改
let arr = [1, 2, 3];
// 参数:开始索引,操作长度,操作的结果们
arr.splice(2, 0, 100);[1,2,100,3]

arr.splice(1, 1);[1,100,3]

分隔符成员

可以用来替换默认的表达式符号

<p>{ num ]}</p>
delimiters: ['{', ']}'],

计算属性成员

1、computed中定义的是方法属性,data中定义的也是属性,所以不需要重复定义(省略data中的)
2、方法属性的值来源于绑定的方法的返回值
3、方法属性必须在页面中渲染后,绑定的方法才会被启用(调用)
4、方法中出现的所有变量都会被监听,任何变量发生值更新都会调用一次绑定的方法,重新更新一下方法属性的值
5、方法属性值不能手动设置,必须通过绑定的方法进行设置

<div id="app">
    <input type="text" v-model="num1">
    +
    <input type="text" v-model="num2">
    =
    <input type="text" v-model="res">
</div>

    new Vue({
        el: '#app',
        data: {
            num1:'',
            num2:'',
        },
        computed:{
            res(){
                //如果num1,num2都有值计算,否则显示提示
                return this.num1 && this.num2 ? +this.num1 + +this.num2 : "请填写所有参数"
            }
        }
    })

属性的监听

1、watch中给已有的属性设置监听方法
2、监听的属性值一旦发生更新,就会调用监听方法,在方法中完成相应逻辑
3、监听方法不需要返回值(返回值只有主动结束方法的作用)

<div id="app">
    <input type="text" v-model="num1">
    <input type="text" v-model="res">
</div>

    new Vue({
        el: '#app',
        data: {
            num1:'',
            res:''
        },
        watch:{
            num1(){
                this.res = this.num1
            }
        }
    })

js的类

es5函数可以作为类使用,es6加入了class来规范类

this哪个对象调用就代表谁

 let sex = '女';
    let wl = {
        name:'wl',
        age:22,
        #相当于sex=sex
        sex
    };

    console.log(wl);

    function Student(name,age) {
        this.name = name;
        this.age = age;
        this.eat = function () {
            alert("吃饭饭了");
            return '吃完了'
        }
    }
    let zx =new Student('zx125','18');
    console.log(zx.name);
    console.log(zx.age);

posted @ 2019-11-13 18:56  zx125  阅读(211)  评论(0编辑  收藏  举报