美文网首页
VUE初级入门实践

VUE初级入门实践

作者: 付出的前端路 | 来源:发表于2017-08-03 08:43 被阅读0次

    VUE概述

    生命周期

    <script>
        new Vue({
            el:"#demo",
            data:{
                name:"Hello"
            },
            template:`
                <div>
                    <p>{{name}}</p>
                    <input v-model="name" />
                </div>
            `,
            beforeCreate:function(){
                console.log("创建之前")
                console.log(this.$el)//undefined
                console.log(this.$data)//undefined
            },
            // created 读取数据
            created:function(){
                console.log("创建之后")
                console.log(this.$el)//undefined
                console.log(this.$data)//有
            },
            //beforeCompile  
            beforeMount:function(){
                console.log("挂载之前")
                console.log(this.$el)//有
                console.log(this.$data)//有
                console.log(document.querySelector("#demo"))//只有节点,无数据
            },
            //ready
            mounted:function(){
                console.log("挂载之后")
                console.log(this.$el)//有
                console.log(this.$data)//有
            },
            beforeUpdate:function(){
                console.log("更新之前")
                console.log(this.$el)//有
                console.log(this.$data)//有
                console.log(document.querySelector("body"))
            },
            updated:function(){
                console.log("更新之后")
                console.log(this.$el)//有
                console.log(this.$data)//有
                console.log(document.querySelector("body"))
            }
        })
    </script>
    

    指令

    内置指令

        <!--1.v-text/ng-bind  -->
        <p v-text="name"></p>
    
        <!-- 2.v-html/ng-bind-html -->
        <p v-html="html"></p>
    
        <!-- 3.v-if/ng-if -->
        <p v-if="bool">v-if 真</p>
    
        <!-- 4.v-else !bool / ng-hide -->
        <p v-else>v-else 假</p>
    
        <!-- 5.v-show/ng-show -->
        <p v-show="bool">v-show 真</p>
    
        <!-- 6.v-for/ng-repeat -->
        <ul>
            <li v-for="a in arr" track-by="$index" id="{{$index}}">{{a}}</li>
        </ul>
    
        <!-- 7.v-on:click/ng-click -->
        <button v-on:click="ok()">ok1</button>
        <button @click="ok()">ok2(简写)</button>
    
        <!-- 8.v-bind:class && v-bind:style /ng-class&&ng-style -->
        <p v-bind:class="{blue:bool}">class类名1</p>
        <p :class="{blue:bool}">class类名2(简写)</p>
    
        <!-- 9.v-model -->
        <input type="range" v-model="size" />
        <p v-bind:style="{fontSize:size + 'px'}">字体大小</p>
        <p :style="{fontSize:size + 'px'}">字体大小2(简写)</p>
    
        <!-- 10 给id起名字,注意:1)'name'是字符串,name是变量; 2): 冒号可以省略{{}}(表达式) -->
        <p :id="'name'+name" class="yellow">属性值</p>
    
    

    自定义指令

    // 指令的简单写法 vue 2.0 // 这里将会被 `bind` 和 `update` 调用
    Vue.directive('color', function(ele, attr) {
        //1.获取指令中的属性值;
        ele.style.color = attr.expression
        console.log(attr)
    
        //2.获取非标准属性的属性值;
        var skill = ele.getAttribute("skill")
        console.log(skill);
    });
    

    过滤器

    内置过滤器

    • VUE1.0版本
    <div id="demo">
            <p style="color: red;">1.currency</p>
            <p>{{num|currency "¥" 5}}</p>
            <p style="color: red;">2.lowercase</p>
            <p>{{name|lowercase}}</p>
            <p style="color: red;">3.uppercase</p>
            <p>{{name|uppercase}}</p>
            <p style="color: red;">4.pluralize(复数) 特有</p>
            <p>{{date}}{{date|pluralize 'st' 'nd' 'rd' 'th'}}</p>
            <p style="color: red;">5.json</p>
            <p>{{obj|json 10}}</p>
            <p style="color: red;">6.debounce(延迟器) 特有</p>
            <button @click="ok()|debounce 2000">ok</button>
            <p style="color: red;">7.capitalize(首字母大写) 特有</p>
            <p>{{name|capitalize}}</p>
            <p style="color: red;">8.orderBy</p>
            <ul>
                <li v-for="arr in arrs|orderBy 'age' -1">{{arr.name}} {{arr.age}}</li>
            </ul>
            <p style="color: red;">9.filterBy</p>
            <input v-model="search" />
            <ul>
                <li v-for="arr in arrs|filterBy search in 'name'">{{arr.name}} {{arr.age}}</li>
            </ul>
            <p style="color: red;">9.limitBy</p>
            <input v-model="search" />
            <ul>
                <li v-for="arr in arrs|limitBy 2 1">{{arr.name}} {{arr.age}}</li>
            </ul>
            <p>{{name|limitBy 2 2}}</p>
        </div>
    
    • VUE2.0版本(无内置过滤器)

    自定义过滤器

    <script>
            Vue.filter("ed",function(input){
                return input + "ed";
            });
            new Vue({
                el:"#demo",
                template:`
                <p>{{name|ed}}</p>
                `,
                data:{
                    name:"heightzhang"
                }
            })
    </script>
    

    组件

    DEMO 完整的组件模版(prop,filters,directives,components)

    Vue.component('xheader', {
                props:["message"], //主组件向子组件传递数据; 
                template: `
                    <div style="border:1px solid green">
                        <p v-color="'red'">{{name|ed}}</p>
                        <button @click="ok()">ok</button>
                        <p v-if="message=='1'">1</p>
                    </div>
                `,
                data: function() { 注意://组件中的data 必须是一个函数;
                    return {
                        name: "第一个组件"
                    }
                },
                methods: {  //组件中的方法;
                    ok: function() {
                        console.log("ok")
                    }
                }, 
                filters: { //组件中的过滤器
                    ed: function(input) {
                        return input + "ed";
                    }
                },
                directives: { //组件中的的指令
                    color: function(el, binding, vnode) {
                        console.log(el)
                        el.style.color = binding.value
                    }
                },
                mounted:function(){ //组件中的JS逻辑
                    console.log(this.message)  //桥梁props ,接收message;
                },
                components: { 组件中的嵌套;
                    xcontentheader: {
                        props: ["imgUrl"],
                        template: `
                            <div class="weui-media-box__hd"  >
                                 ![](imgUrl)
                             </div>
                         `,
                         methods:{
                             setImg(imgUrl){
                            this.$store.dispatch('setImg',[imgUrl,true])
                        }
                    }
                 }
            })
    

    通信

    父组件向子组件(props)

    <script>
    //----------子组件
            Vue.component('xheader', {
                props: ["message"], //接收父组件的非标准属性
                template: `
                    <div style="border:1px solid green">
                        <p>{{message}}</p>  //打印出来 =>变量name =>laoyao 
                    </div>
                `,
                data: function() {
                    return {
                        name: "第一个组件"
                    }
                }
            })
    //---------父组件-----------
            new Vue({
                el: "#demo",
                data: {
                    name: "laoyao"
                },
                computed: {
                    named: function() {
                        this.ok()
                        return this.name + "ed"
                    }
                },
                template: `
                    <div>
                        <input v-model="name" />
                        <xheader :message="name"></xheader> //父组件的非标准属性(传递变量name)
                        <p>{{named}}</p>
                    </div>
                `,
                methods: {
                    ok: function() {
                        console.log("ok")
                    }
                }
            })
        </script>
    

    子组件向父组件 / 兄弟组件之间

    VUEX

    DEMO(子组件xlist向xgallery传递数据)


    index中心

    <script>
    // 新建一个状态管理:
    var store = new Vuex.Store({
        state:{  //全局数据的集中栈
            imgUrl:null,
            isShowGallery:null,
        },
        getters:{   //处理state中的数据 类似过滤器的作用;
            getImgurl(state){
                return state.imgUrl
            },
            getBool(state){
                return state.isShowGallery
            }
    
        },
        //分发状态 改变state.imgUrl原先的值
        mutations:{
            setImg:function(state,data){
                state.imgUrl = data[0];
                state.isShowGallery=data[1];
            }
        },
        //action触发
        actions:{
            setImg(context,data){
                context.commit("setImg",data)
            }
        }
    });
    
    var vue = new Vue({
        el: "#demo",
        template: `
            <div>
                <xlist></xlist>
                <xgallery></xgallery>
            </div>
            `,
            store//第一步将Soter注入构造器中;  这个一定要写
    })
    </script>
    

    上传数据部分

    <xlist>
        methods:{
            setImg(imgUrl){
               this.$store.dispatch('setImg',[imgUrl,true])
             }
        }
    </xlist>
    

    接收数据部分

    <xgallery>
        computed:{
                isShowGallery(){
                    return this.$store.getters.getBool
                },
                imgUrl(){
                    return this.$store.getters.getImgurl
                }
        }
     //  数据显示 => {{imgUrl}}  / {{isShowGallery}}
    </xgallery>
    

    路由

    标准写法

    <script>
            //1.1定义但是没注册
            var page1 = {
                template: `
                    <div>第一页</div>
                `
            }
    
            var page2 = {
                template: `
                    <div>第二页</div>
                `
            }
            //1.2注册;
            var router = new VueRouter({
                routes: [{
                        path: '/index',
                        component: page1
                    }, {
                        path: '/home',
                        component: page2
                    },
                    { 
                        path: '/', redirect: 'index'   //2重定向
                    }]  
            })
            new Vue({
                el:"#app",
                router,// (缩写)相当于 routes: routes
                template:`
                    <router-view></router-view>
                `
            })
            //3.路由传参数;
        </script>
    

    嵌套路由(三层)

    <script>
        var router = new VueRouter({
            routes: [{
                    path: '/index',
                    component: {
                        template: `
                            <div>
                                这是index的页面
                                <a href="#/index/a">a</a>
                                <a href="#/index/b">b</a>
                                <router-view></router-view>
                            </div>
                        `
                    },
                    children: [{
                        //子路由没有/
                        path: 'a',
                        component: {
                            template: `
                                <div>
                                    <p>a</p>
                                    <a href="#/index/a/aa">aa</a>
                                    <a href="#/index/a/bb">bb</a>
                                    <router-view></router-view>
                                </div>
                            `
                        },
                        children: [{
                            path: 'aa',
                            component: {
                                template: "<p>aa</p>"
                            }
                        }, {
                            path: 'bb',
                            component: {
                                template: "<p>bb</p>"
                            }
                        }]
                    }, {
                        //子路由没有/
                        path: 'b',
                        component: {
                            template: "<p>b</p>"
                        }
                    }]
                }, {
                    path: '/detail',
                    component: {
                        template: `
                            <div>
                                这是detail的页面
                            </div>
                        `
                    }
                }, {
                    path: '/',
                    redirect: '/index'
                }]
                // (缩写)相当于 routes: routes
            });
            new Vue({
            el: "#demo",
            template: `
                <div>
                    <a href="#/index">index</a>
                    <a href="#/detail">detail</a>
                    <router-view></router-view>
                </div>
            `,
            router,
            mounted() {
                console.log(this)
            }
        })
    </script>
    

    补充:

    定义全局属性与方法

    /*
        // 一个页面用一个构造器即可;不建议用多个构造器;  
        //可以将构造器理解为一个组件;组件最大;  组件与组件之间的通信 ; 
         var(全局属性) => angular中的$rootScope
         var  test(全局方法) => angular中的server;
    */
        var exchange = 1;
        var test = function(log){
            console.log(log)
        }
        //构造器 组件的一种呈现
        new Vue({
            //element节点 querySelector
            el:"#demo",
            //HTML CSS
            template:`
            <div>
                <p>{{name}} {{exchange}}</p>
                <button @click="test('abc')">Ok</button>
            </div>`,
            //需要绑定的数据 $scope
            data:{
                name:"Hello",
                exchange
            },
            methods:{
                test
            }
        })
    

    如何获取$index索引值?

    DEMO

    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
        </head>
        <body>
            <div id="demo">
                <p v-for="(arr,index) in arrs" track-by="$index" :id="index">{{arr}}</p>
            </div>
        </body>
        <script src="../js/vue2.js"></script>
        <script>
            //构造器
            new Vue({
                //element节点 querySelector
                el:"#demo",
                //需要绑定的数据 $scope
                data:{
                    name:"Hello World",
                    arrs:["a","b","c","a","d"]
                }
            })
        </script>
    </html>
    

    表单控件

    DEMO

    <html>
    
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    
    <body>
        <!-- 双向数据绑定而已; -->
        <div id="demo">
            <p style="color: red;">Radio</p>
            A:
            <input type="radio" value="A" v-model="radio" /> B:
            <input type="radio" value="B" v-model="radio" /> C:
            <input type="radio" value="C" v-model="radio" />
            <p>{{radio}}</p>
            <p style="color: red;">CheckBox</p>
            A:
            <input type="checkbox" value="A" v-model="checkbox" /> B:
            <input type="checkbox" value="B" v-model="checkbox" /> C:
            <input type="checkbox" value="C" v-model="checkbox" />
            <p>{{checkbox}}</p>
        </div>
    </body>
    <script src="../js/vue.js"></script>
    <script>
    //构造器
    new Vue({
        //element节点 querySelector
        el: "#demo",
        //需要绑定的数据 $scope
        data: {
            radio: "B",
            name: "Hello World",
            checkbox: ["A", "C"]
        }
    })
    </script>
    
    </html>
    

    render(高级玩法:可用来替换template)

    <script>
    new Vue({
        el: "#demo",
        data: {
            name: "laoyao"
        },
        //template: "<div>{{name}}</div>",
        render: function(createElement) {
            return createElement(
                //标签
                'div', // tag name 标签名称
                {
                    attrs: {
                        id: 'foo'
                    },
                }, // 子组件中的阵列
                [createElement(
                    'p',
                    {
                        style:{
                            color: 'red',
                        }
                    }
                ),["Hello"]]
            )
        },
    })
    </script>
    

    过渡效果

    内置的组件transition

    参考: 过渡:进入,离开和列表

    相关文章

      网友评论

          本文标题:VUE初级入门实践

          本文链接:https://www.haomeiwen.com/subject/sopulxtx.html