Vue(一)初识

Vue的意义:将开发者的精力从dom操作解脱,更加专注于数据的操作,
数据驱动,界面的渲染 随着数据的变化自动变化
    1.将开发者的精力从dom中解除, 极少做dom操作
    2.通过指令(directive)将元素和数据进行绑定  
    3.数据变化元素界面变化
    4.开发者关注数据的变化

配置:Vue官网下载;或npm install vue

js引入包后,实例化Vue对象;

var vm = new Vue({//实例化
             el: '#btn',//选择标签(作用区域)
             data: {//变量(数据),关联页面的标签
                    bool: true
                },
            methods:{//写方法的对象
                Fn1(){//方法
                        },
                Fn2(){
                        }
                }

            });

渲染数据:

<div id='app'>{{name}}</div>//用插值的方式{{}}来放置data的变量

Vue的数据是双向数据的绑定,数据相互依赖,缺点是源头很难找到,但是提升了数据的感知

指令:

v-if(条件渲染)

<p v-if='bool'></p>//条件满足时显示元素
<p v-else></p>//否则显示元素
<p v-else-if='bool'></p>//条件满足时显示元素

v-for(列表渲染)用for in和for of都行(注意:若遍历数组的时候有重复项,要用一个bind绑定数据否则会出错,如<li v-for='(item,index) in list' v-bind : key=index>{{item}}--{{index}}</li>

//数组
<li v-for='item in list'>{{item}}</li>//item是每一项,list是操作的数组(根据list的长度新建li)

<li v-for='(item,index) in list'>{{item}}--{{index}}</li>//item是每一项,index是数组索引,list是操作的数组(根据list的长度新建li)

<li v-for='item in 20'>{{item}}</li>//直接创造20个li

//字符串
<li v-for='item in "hello vue"'>{{item}}</li>//遍历字符串,输出9个li分别是字符每一项

//对象
<li v-for="(val,key,index) in obj">{{key}}:{{val}}---{{index}}</li>//val,key,index分别是对象的每项的属性,属性名,索引

v-click(事件指令)

<button v-on:click="test">点我</button>//类似于onclick,test是Vue实例化中的函数
//v-on:click相当于@click
<a v-on:click.stop="doThis"></a>//取消冒泡事件
<div v-on:click.self="doThat">...</div>//只有点击这个元素自身才会触发

v-bind(属性设置)

<div v-bind:class='state?"red":"green"'>//v-bind:'属性名'='属性值'
//可以写成<div v-bind:class='state?"red":"green"'>

过滤器:(对数据进行处理的函数)

全局过滤器:和局部过滤的区别(局部过滤器只能在当前的组件中使用)

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>

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

    <body>
        <div id="box">
            {{nowTime|getTime}}
            <!--  这是参数   这是过滤,中间用|隔开-->
        </div>
        <script>
            //全局过滤
            Vue.filter('getTime', function (value) {
                //中间可以写对数据的处理
                return value;
            });
            var vm = new Vue({
                el: '#box',
                data: {
                    nowTime: Date.now()
                }
            });
        </script>
    </body>

</html>

局部过滤:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>

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

    <body>
        <div id="box">
            {{nowTime|getTime}}
            <!--  这是参数   这是过滤,中间用|隔开-->
        </div>
        <script>
            //局部过滤
            var vm = new Vue({
                el: '#box',
                data: {
                    nowTime: Date.now()
                },
                filters: {
                    getTime: function (value) {
                        //中间可以写对数据的处理
                        return value;
                    }
                }
            });
        </script>
    </body>

</html>

组件:就是vue的一个拓展实例

全局组件:(整个页面都能使用)

<template id="tp1">
            <!-- 组件创建 -->
            <div></div>
</template>
var mod = {//组件配置
                template: '#tp1',//选中组件
                data() {
                    return {
                    //写变量
                }
                },
                methods: {
                    //写函数
                }
            }
Vue.component('mod', mod);//注册组件
//直接在页面中输入
<mod></mod>
//即可使用

局部组件:(只能在当前选中作用范围中使用)

let box = new Vue({
                el: '#box',//当前作用范围是id为box的标签内
                data: {
                    
                },
                methods: {
                   
                },
                components: {//新建局部组件
                    mod: ({
                        template: '#tp1',
                        data() {
                            return {}
                        },
                        methods: {

                        }
                    })
                }
            });

组件间数据的传输:(类似事件抛发和监听)

父组件传给子组件:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./vue.js"></script>
    </head>

    <body>
        <div id="box">
            <fat></fat>
        </div>
        <!-- 子组件 -->
        <template id="son">
            <div>{{callson}}</div>
        </template>
        <!-- 父组件,父组件中包含子组件 -->
        <template id="fat">
            <div>
                <!-- 当父组件数据改变时,通过将数据保存在自身属性的方法传输 -->
                <div>{{fbool}}</div>
                <button @click='change'>Change</button>
                <!-- 将callson作为属性,附带数据传输给子元素 -->
                <son :callson='fbool'></son>
            </div>
        </template>
        <script>
            Vue.component('son', {
                template: '#son',
                data: function () {
                    return {

                    }
                },
                props: ['callson'] //子组件在该处接收数据
            });
            Vue.component('fat', {
                template: '#fat',
                data: function () {
                    return {
                        fbool: false
                    }
                },
                methods: { //点击父组件的按钮时,父组件内数据改变
                    change() {
                        this.fbool = !this.fbool;
                    }
                }
            });
            var box = new Vue({
                el: '#box'
            });
        </script>
    </body>

</html>

子组件传给父组件:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./vue.js"></script>
    </head>

    <body>
        <div id="box">
            <fat></fat>
        </div>
        <template id="son">
            <div>
                <button @click='change'>Change</button>
                <!-- <div>{{sbool}}</div> -->
            </div>

        </template>
        <template id="fat">
            <div>
                <div>{{fbool}}</div>
                <!-- 新建自定义事件,绑定父元素中的函数,传参数写在后面用逗号隔开 -->
                <son @callfat='changeF'></son>
                <!-- 当子元素被点击时触发父元素的方法 -->
            </div>
        </template>
        <script>
            Vue.component('son', {//点击子组件的按钮时,子组件内数据改变
                template: '#son',
                data: function () {
                    return {
                        sbool: false
                    }
                },
                methods: {
                    change() {
                        this.$emit('callfat');
                        this.sbool = !this.sbool;
                    }
                }
            });
            Vue.component('fat', { 
                template: '#fat',
                data: function () {
                    return {
                        fbool: false
                    }
                },
                methods: {
                    changeF() {
                        this.fbool = !this.fbool;
                    }
                }
            });
            var box = new Vue({
                el: '#box'
            });
        </script>
    </body>

</html>

兄弟组件:(结合子传父,父再传子):

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src="./vue.js"></script>
    </head>

    <body>
        <div id="box">
            <fat></fat>
        </div>
        <template id="sonf">
            <div>
                <button @click='change'>Change</button>
                <div>First <br>{{sfbool}}</div>
            </div>

        </template>
        <template id="sons">
            <div>Second <br>{{callson}}</div>
        </template>
        <template id="fat">
            <div>
                <sonf @callfat='changeF'></sonf>
                <sons :callson='fbool'></sons>
            </div>
        </template>
        <script>
            Vue.component('sonf', {
                template: '#sonf',
                data: function () {
                    return {
                        sfbool: false
                    }
                },
                methods: {
                    change() {
                        this.$emit('callfat');
                        this.sfbool = !this.sfbool;
                    }
                }
            });

            Vue.component('sons', {
                template: '#sons',
                data: function () {
                    return {

                    }
                },
                props: ['callson']
            });

            Vue.component('fat', {
                template: '#fat',
                data: function () {
                    return {
                        fbool: false
                    }
                },
                methods: {
                    changeF() {
                        this.fbool = !this.fbool;
                    }
                }
            });
            var box = new Vue({
                el: '#box'
            });
        </script>
    </body>

</html>

不相邻兄弟组件:

let angel=new Vue();//引入一个Vue实例
angel.$emit('test','Hello')//传送方在函数中抛出事件及数据
angel.$on('test',this.change)//接收方接收事件及数据

动画:

<transition name='aaa'>css中用name值进行动画
若中间有1个以上元素,需要在外面嵌套一个元素,再给该元素加
  	<div v-if='show'>
  		<p>Hello</p>
  	    <p>World</p>
  	</div>
</transition>
        .aaa-enter{进入前
			opacity: 0;
		}
		.aaa-enter-to{进入后
			opacity: 1;
		}
		.aaa-enter-active{过渡时间
			transition: all 3s;
		}

		.aaa-leave{离开前
			opacity: 1;
		}
		.aaa-leave-to{离开后
			opacity: 0;
		}
		.aaa-leave-active{过渡时间
			transition: all 3s;
		}

 

posted @ 2018-12-14 20:56  阿宇的编程之旅  阅读(234)  评论(0编辑  收藏  举报