• vue 前端框架 (三)


    VUE 生命周期

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script type="text/javascript" src="js/vue.js"></script>
            <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
        </head>
        <body>
            <div id="app"></div>
            
            
            
            
            <script>
                var vm = Vue({
                    el:'#app',
                    data:{},
                    methods:{},
                    filters:{},
                    directives:{},
                    
                    // 什么是生命周期:VUE 实例创建/运行/销毁 ,总是伴随着各种各样的事件,
                    // 这些事件,统称为生命周期
                    
                    // 生命周期钩子:就是生命周期事件的别名,
                    
                    // 主要的生命周期函数分为:
                    
                    // 创建期间的生命周期函数:
                    // vue第一个生命周期函数
                    beforeCreate(){}
                    // 实例刚在内存中被创建出来,此时,还没有初始化data和methods属性
                    
                    // vue 第二个生命周期函数
                    created(){}
                    // 实例已经在内存中创建,此时data和mothods 已经创建好了,此时还没有开始编译模板
                    
                    // vue 第三个生命周期函数
                    beforeMount() {}
                    // 此时已经完成了模板的编译,但是还没有挂载到页面中
                    
                    // vue 第四个生命周期函数
                    mounted(){}
                    // 此时,已经编译好了模板,挂载到页面指定容器中显示了
                    
                    // 运行期间的生命周期函数:
                    // vue 第五个生命周期函数
                    beforeUpdate(){}
                    // 状态更新之前执行此函数,此时data中的状态值是最新的,但是界面上显示的数据还是旧的,因为此时还没有开始重新渲染DOM 节点
                    
                    // vue 第六个生命周期函数
                    updated(){}
                    // 实例更新完毕之后调用此函数,此时data中的状态值和界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了.
                    
                    // 销毁期间的生命周期函数:
                    // vue 第七个生命周期函数
                    beforeDestroy(){}
                    // 实例销毁之前调用,这一步,实例乃然可用
                    
                    // vue 第八个生命周期函数
                    destroyed(){}
                    // Vue实例销毁后调用,调用后,vue实例指示的所有东西都会解绑定,所有的事件监听器都会被移除,所有的子实例也会被销毁.__constructor__()
                    
                    
                })
            </script>
        </body>
    </html>

    vue-resource 获取后端数据

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script type="text/javascript" src="js/vue.js"></script>
            <script src="js/vue-resource.js"></script>
            <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
        </head>
        <body>
            <div id="app">
                <input type="button" value="get点击" @click="getinfo" />
                <input type="button" value="post点击" @click="postinfo" />
                <input type="button" value="jsonp点击" @click="jsonpinfo" />
            </div>
            
            <script>
                var vm = new Vue({
                    el:'#app',
                    data:{},
                    methods:{
                        getinfo(){
                            this.$http.get('http://127.0.0.1:5000/infoapi').then(function(result){
                                console.log(result.body.msg)
                            })
                        },
                        postinfo(){
                            var data = {'zhuangtai':'OK'}
                            this.$http.post('http://127.0.0.1:5000/infoapi',{data},{emulateJSON:true}).then(result =>{
                                console.log(result.body.msg)
                                console.log(typeof(result))
                            })
                        },
                        jsonpinfo(){
                            this.$http.jsonp('http://127.0.0.1:5000/infoapi').then(result => {
                                console.log(result.body)
                            })
                        },
                    },
                })
            </script>
        </body>
    </html>

    获取后端数据 练习

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-resource.js"></script>
            <link rel="stylesheet" href="css/bootstrap.min.css">
        </head>
        <body>
            <div id='app'>
                <div class="panel panel-primary">
                    <div class="panel-heading">
                        <h3 class="pannel-title">添加品牌</h3>
                    </div>
                    <div class="panel-body form-inline">
                        <label>
                            Name:
                            <input type="text" class="form-control" v-model="name" @keyup.enter="add">
                
                        </label>
                        <input type="button" value="添加" class="btn btn-primary" @click="add">
                    </div>
                </div>
                <br>
                <table class="table table-bordered table-hover table-striped" >
                    <tr>
                        <th>ID</th>
                        <th>Name</th>
                        <th>操作</th>
                    </tr>
                    <tr v-for='i in info' :key='i.id'>
                        <td>{{ i.id }}</td>
                        <td>{{ i.name }}</td>
                        <td><a href="#" @click.prevent='delinfo(i.id)'>删除</a></td>
                    </tr>
                </table>
                
            </div>
            <script>
                Vue.http.options.emulateJSON = true;
                Vue.http.options.root = 'http://172.16.3.104:5000/';
            
                var vm = new Vue({
                    el:'#app',
                    data:{
                        name:'',
                        searchname:'',
                        info:[],
                    },
                    methods:{
                        getinfo(){
                            this.$http.get('infoapi').then( data => {
                                this.info = data.body
                            })
                        },
                        add(){
                            this.$http.post('addinfoapi',{name:this.name},{}).then( data => {
                                if(data.body.status == 'OK'){
                                    this.name = ''
                                    this.getinfo()
                                }else{
                                    alert('添加失败')
                                }
                            })
                        },
                        delinfo(id){
                            this.$http.post('delinfoapi',{id:id},{}).then( data => {
                                if(data.body.status == 'OK'){
                                    this.getinfo()
                                }else{
                                    alert('删除失败')
                                }
                            })
                        },
                    },
                    created(){
                        this.getinfo()
                    },
    
                });
            </script>
        </body>
    </html>

    VUE 动画效果

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-resource.js"></script>
            <link rel="stylesheet" href="css/bootstrap.min.css">
            
            <style>
                .v-enter,.v-leave-to{
                    opacity: 0;
                    transform: translateX(150px);
                }
                .v-enter-active,.v-leave-active{
                    transition: all 2s ease
                }
                .my-enter,.my-leave-to{
                    opacity: 0;
                    transform: translateX(300px) translateY(150px);
                }
                .my-enter-active,.my-leave-active{
                    transition: all 1s ease
                }
                
                
            </style>
        </head>
        <body>
            <div id='app'>
                <input type="button" @click="istrue=!istrue" value="点击">
                <transition>
                    <p v-show="istrue">啊啊啊啊啊啊啊啊啊啊</p>
                </transition>
                <br>
                <input type="button" @click="istrue2 =!istrue2" value="点击">
                <transition name='my'>
                    <p v-show="istrue2">啊啊啊啊啊啊啊啊啊啊</p>
                </transition>
    <!--         点击按钮,显示p标签 再次点击隐藏皮标签
                1.transition元素将p标签包裹
                2.通过修改transition 所提供的样式修改
                .v-enter,.v-enter-to  入场前,入场后
                .v-leave,.v-leave-to  离场前,离场后
                .v-enter-active,    入场动作
                .v-leave-active,    离场动作 -->
                
                
            </div>
            
            <script>
                Vue.http.options.emulateJSON = true;
                Vue.http.options.root = 'http://172.16.3.104:5000/';
            
                var vm = new Vue({
                    el:'#app',
                    data:{
                        istrue:false,
                        istrue2:false,
                    },
                    methods:{},
                });
            </script>
        </body>
    </html>

    第三方css动画效果

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-resource.js"></script>
            <link rel="stylesheet" href="css/bootstrap.min.css">
            <link rel="stylesheet" href="css/animate.css">
        </head>
        <body>
            <div id='app'>
                <input type="button" @click="istrue=!istrue" value="点击">
                <transition 
                enter-active-class='animated bounceIn' 
                leave-active-class='animated bounceOut'
                :duration="{ enter:200, leave:500 }">
                    
                    <p v-show="istrue">我来了啦!!</p>
                </transition>
            </div>
            
            <script>
    
            
                var vm = new Vue({
                    el:'#app',
                    data:{
                        istrue:false,
                    },
                    methods:{},
                });
            </script>
        </body>
    </html>

    VUE 动画钩子函数

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-resource.js"></script>
            <link rel="stylesheet" href="css/bootstrap.min.css">
            <style>
                .v-enter,.v-leave-to{
                    opacity: 0;
                    transform: translateY(400px);
                }
                
                .v-enter-active,
                .v-leave-active{
                    transition: all 0.8s ease;
                }
                
                /* 这里必须两个属性连用要不不起效果 */
                .v-move{
                    transition: all 1s ease;
                }
                .v-leave-active{
                    position: absolute;
                }
    
            </style>
        </head>
        <body>
            <div id='app'>
                <div class="panel panel-primary">
                    <div class="panel-heading">
                        <h3 class="pannel-title">添加品牌</h3>
                    </div>
                    <div class="panel-body form-inline">
                        <label>
                            Name:
                            <input type="text" class="form-control" v-model="name" @keyup.enter="add">
                
                        </label>
                        <input type="button" value="添加" class="btn btn-primary" @click="add">
                    </div>
                </div>
                <br>
                <table class="table table-bordered table-hover table-striped" >
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>Name</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody is="transition-group">
                        <tr v-for='i in info' :key='i.id'>
                            <td>{{ i.id }}</td>
                            <td>{{ i.name }}</td>
                            <td><a href="#" @click.prevent='delinfo(i.id)'>删除</a></td>
                        </tr>
                    </tbody>
                </table>
            
            </div>
            <script>
                Vue.http.options.emulateJSON = true;
                Vue.http.options.root = 'http://172.16.3.104:5000/';
            
                var vm = new Vue({
                    el:'#app',
                    data:{
                        name:'',
                        searchname:'',
                        info:[],
                    },
                    methods:{
                        getinfo(){
                            this.$http.get('infoapi').then( data => {
                                this.info = data.body
                            })
                        },
                        add(){
                            this.$http.post('addinfoapi',{name:this.name},{}).then( data => {
                                if(data.body.status == 'OK'){
                                    this.name = ''
                                    this.getinfo()
                                }else{
                                    alert('添加失败')
                                }
                            })
                        },
                        delinfo(id){
                            this.$http.post('delinfoapi',{id:id},{}).then( data => {
                                if(data.body.status == 'OK'){
                                    this.getinfo()
                                }else{
                                    alert('删除失败')
                                }
                            })
                        },
                    },
                    created(){
                        this.getinfo()
                    },
    
                });
            </script>
        </body>
    </html>

    VUE全局组件

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>定义vue组件</title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <!-- 
            什么是组件:
            组件的组件的出现就是为了拆分vue实例的代码量,能够让我们以不同的组件来划分不同的功能模块,将我们需要什么样的功能,就可以去调用对应的组件即可.
            
            组件和模块的区别:
            组件化:
            是从代码逻辑的角度进行划分,方便diamante分层开发,保证每个功能模块的职能单一;
            组件化:
            是从UI界面的角度进行划分的,前端组件化,方便组件UI的重用 
            -->
            <div id="app">
                    <!-- 第一种方式 -->
                    <!-- <mycom1></mycom1> -->
                    <!-- <my-com2></my-com2> -->
                    
                    <!-- 第二种方式 -->
                    <mycom1></mycom1>
                    
            </div>
        
            <template  id="muban">
                <div>
                    <h1>你好 中国!</h1>
                    <p>这是在app实例外定义的一个模板 id=muban</p>
                </div>
            </template>
        
            <script>
    //             // 第一种创建全局组件方式
    //             //使用vue.extend来创建全局的vue组件
    //             var com1 = Vue.extend({
    //                 template:"<h1>hello world1!!</h1>"
    //             })
    //             
    //             //使用vue.component定义全局组件的时候,
    //             //组件名称使用了 驼峰命名,则需要把大写的驼峰改为小写的字母,
    //             //同时两个单词之前 使用'-'链接
    //             Vue.component('mycom1',com1)
    //             Vue.component('myCom2',com1)
    //             
    
    //             // 上面的简写方式
    //             Vue.component('mycom1',Vue.extend({
    //                 template:"<h1>hello world1!!</h1>"
    //             }))
                
    //             //上面的再简写方式
    //             Vue.component('mycom1',{
    //                 template:"<h1>hello world1!!</h1>"
    //             })
                
                // 注意 无论是哪种方式 template属性指向的模板内容,必须有且只能有唯一的一个根元素.
                
                // 第二种创建全局模板的方式
                // 在#app实例外创建一个template元素模板,然后引入app实例内部
                Vue.component('mycom1',{
                    template:'#muban'
                })
                
                // 需要创建vue实例,得到viewmodel 才能渲染组件
                var vm = new Vue({
                    el:'#app',
                })
            
            </script>
        </body>
    </html>

    Vue 私有组件

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>定义vue组件</title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <div id="app">
                    <muban></muban>
                    <muban2></muban2>
            </div>
            
            <template id='muban2'>
                <div >
                    <h1>这是私有组件!</h1>
                </div>
            </template>
    
    
            <script>
                var vm = new Vue({
                    el:'#app',
                    data:{},
                    methods:{},
                    filters:{},
                    directives:{},
                    
                    components:{
                        muban:{
                            template:'<div><h1>你好 世界!</h1></div>'
                        },
                        muban2:{
                            template:'#muban2'
                        },
                    },
                    
                    beforeCreate(){},
                    created(){},
                    beforeMount(){},
                    mounted(){},
                    beforeUpdate(){},
                    updated(){},
                    beforeDestroy(){},
                    destroyed(){},
                    
                })
            
            </script>
        </body>
    </html>

    VUe 组件应用data 属性

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>定义vue组件</title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <div id="app">
                    <muban></muban>
                    <muban></muban>
                    <muban2></muban2>
                    
                    
            </div>
            
            <template id='muban2'>
                <div >
                    <h1>这是私有组件!</h1>
                </div>
            </template>
    
    
            <script>
                var vm = new Vue({
                    el:'#app',
                    data:{},
                    methods:{},
                    filters:{},
                    directives:{},
                    
                    components:{
                        muban:{
    //                         1.组件可以有自己data数据
    //                         2.组件的data和实例data有些不一样,实例中的data可以为一个对象,但是组件中的data必须是一个方法
    //                         3.组件中data除了必须为一个方法之外,这个方法内部,还必须返回一个对象才行;
    //                         4.组件中的data数据,使用方式和实例中的data使用方式完全一样.
                            
                            template:'<div><input type="button" value="+1" @click="add" ><h1>{{count}}</h1></div>',
                            data(){
                                return{count:0}
                            },
                            methods:{
                                add(){
                                    this.count ++
                                }
                            },
                            
                        },
                        muban2:{
                            template:'#muban2'
                        },
                    },
                    
                    beforeCreate(){},
                    created(){},
                    beforeMount(){},
                    mounted(){},
                    beforeUpdate(){},
                    updated(){},
                    beforeDestroy(){},
                    destroyed(){},
                    
                })
            
            </script>
        </body>
    </html>

    Vue 组件切换

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <div id="app">
                <!-- 第一种组件切换的方式 -->
                <a href="#" @click.prevent="flag=true">登录</a>
                <a href="#" @click.prevent="flag=false">注册</a>
                <login v-if='flag'></login>
                <register v-else='flag'></register>
                
                <!-- 第二种组件切换的方式 -->
                <a href="#" @click.prevent="flag2='login'">登录</a>
                <a href="#" @click.prevent="flag2='register'">注册</a>
    
                <component :is='flag2'></component>
            
    <!--     vue提供的标签 回顾!
            component,
            template,
            transition,
            transition-group -->
            
            
            
            </div>
            
            
            
            <script>
                Vue.component('login',{
                    template:'<h1>登录组件</h1>'
                })
                Vue.component('register',{
                    template:'<h1>注册组件</h1>'
                })
                
                var vm = new Vue({
                    el:'#app',
                    data:{
                        flag:true,
                        flag2:'login',
                    }
                    
                    
                })
                
            </script>
        </body>
    </html>

    VUE 组件切换+ 动画效果

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <style type="text/css">
                .v-enter,.v-leave-to{
                    opacity: 0;
                    transform: translateX(100px);
                }
                
                .v-enter-active,.v-leave-active{
                    transition: all 1s ease;
                }
            </style>
        </head>
        <body>
            <div id="app">
                <!-- 第一种组件切换的方式 -->
                <a href="#" @click.prevent="flag=true">登录</a>
                <a href="#" @click.prevent="flag=false">注册</a>
                <login v-if='flag'></login>
                <register v-else='flag'></register>
                
                <!-- 第二种组件切换的方式 -->
                <a href="#" @click.prevent="flag2='login'">登录</a>
                <a href="#" @click.prevent="flag2='register'">注册</a>
    
                <!-- 通过mode属性 设置组件切换时候的模式 -->
                <transition mode='out-in'>
                    <component :is='flag2'></component>
                </transition>
                
    <!--     vue提供的标签 回顾!
            component,
            template,
            transition,
            transition-group -->
            
            
            
            </div>
            
            
            
            <script>
                Vue.component('login',{
                    template:'<h1>登录组件</h1>'
                })
                Vue.component('register',{
                    template:'<h1>注册组件</h1>'
                })
                
                var vm = new Vue({
                    el:'#app',
                    data:{
                        flag:true,
                        flag2:'login',
                    }
                    
                    
                })
                
            </script>
        </body>
    </html>

    VUe动画小球

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <style type="text/css">
                #ball{
                    width: 15px;
                    height: 15px;
                    background-color: #269ABC;
                    border-radius: 50%;
                }
                
            </style>
        </head>
        <body>
            <div id="app">
                <input type="button" value="按钮" @click="flag=!flag" />
                
                <transition
                    @before-enter = "benter"
                    @enter = 'enter'
                    @after-enter='fenter'
                >
                    <div id="ball" v-show="flag"></div>
                </transition>
                
            </div>
            <script>
                var vm = new Vue({
                    el:'#app',
                    data:{
                        flag:false,
                    },
                    methods:{
                        benter(el){
                            el.style.transform = 'translate(0,0)'
                        },
                        enter(el,done){
                            el.offsetWidth
                            el.style.transform = 'translate(150px,450px)'
                            el.style.transition='all 1s ease'
                            done()
                        },
                        fenter(el){
                            this.flag = !this.flag
                        },
                    }
                })
                
            </script>
        </body>
    </html>

    VUE 组件向子组件传值

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <div id="app">
                <com1 :zzz='msg'></com1>
            </div>
            <script>
    //             子组件中要访问父类数据,
    //             1.首先父类数据要绑定到模板上(传递数据给模板)
    //             2.子组件 要引入父类数据
    //             3.子组件 应用 引入的父类自定义的数据名
                
                var vm = new Vue({
                    el:'#app',
                    data:{
                        msg:'这是父类 数据!'
                    },
                    methods:{},
                    components:{
                        com1:{
                            template:'<h1>{{info}}这是私有组件!-{{zzz}}</h1>',
                            // 组件中data数据 对于组件是可以读写
                            data(){
                                return {
                                    info:'--这是组件数据--',
                                }
                            },
                            // 组件中定义的父类数据 是只读的
                            props:['zzz'],
                        }
                    }
                })
                
            </script>
        </body>
    </html>

    VUE 父组件方法传递给子组件/共享子组件属性

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <div id="app">
                <com1 @zzz='show'></com1>
            </div>
            <script>
                var vm = new Vue({
                    el:'#app',
                    data:{
                        msg:'这是父类 数据!',
                        sonmsg:null,
                    },
                    methods:{
                        // **传递参数
    //                     show(d1){
    //                         console.log('this 父组件 ! OK!' + d1)
    //                     },
                        show(d1){
                            console.log('this 父组件 ! OK!')
                            this.sonmsg = d1 
                        },
    
    
                    },
                    components:{
                        com1:{
                            template:'<h1>这是私有组件!<input type="button" value="按钮" @click="fshow"></h1>',
                            data(){
                                return {
                                    sonmsg:{name:'sonname'},
                                }
                            },
                            methods:{
                                fshow(){
                                    // **传递参数,第二的位置传递参数
                                    // this.$emit('zzz','123')
                                    
                                    // 将子组件的data传递至方法然后父组件可以从方法获取子组件数据
                                    this.$emit('zzz',this.sonmsg)
                                    
                                }
                            }
                        }
                    }
                })
                
            </script>
        </body>
    </html>

    VUE 评论练习

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <div id="app">
                <muban0 @ftj='tj' ></muban0>
                <div>
                    <table>
                        <tr v-for='i in list'>
                            <td>{{i.pl}}</td>
                            <td>{{i.name}}</td>
                        </tr>
                    </table>
                </div>
            
            
            </div>
            
            
            <template id="muban0">
                <div>
                    <input type="text" placeholder="评论人" v-model="name"/>
                    <input type="text" placeholder="评论" v-model="pl"/>
                    <input type="button" value="发表评论" @click="fbpl" />
                </div>
            </template>
            
            <script>
                var vm = new Vue({
                    el:'#app',
                    data:{
                        list:[
                            {name:'a',pl:'aaaa'},
                        ]
                    },
                    created(){
                        this.tj()
                    },
                    methods:{
                        tj(){
                            var list = JSON.parse(localStorage.getItem('cmts') || '[]')
                            this.list = list
                        },
                    },
                    components:{
                        muban0:{
                            data(){
                                return {
                                    name:'',
                                    pl:'',
                                }
                            },
                            template:'#muban0',
                            methods:{
                                fbpl(){
                                    var aaa = {name:this.name,pl:this.pl}
                                    var list = JSON.parse(localStorage.getItem('cmts') || '[]')
                                    list.unshift(aaa)
                                    localStorage.setItem('cmts',JSON.stringify(list))
                                    this.name = this.pl = ''
                                    
                                    this.$emit('ftj')
                                }
                            },
                        }
                    }
                })
                
            </script>
        </body>
    </html>

    vue $ref绑定DOM元素以及元素组件

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>ref</title>
            <script src="js/vue.js"></script>
        </head>
        <body>
            <div id="app">
                    <muban ref='r1'></muban>
                    
                    <p ref='r2'>这是p标签</p>
                    
                    <br>
                    <input type="button" value="r1点击获取组件数据以及处罚组件方法" @click="r1click"/>
                    <input type="button" value="r2点击获取r2DOM对象" @click="r2click" />
                    
            </div>
            
            <script>
                var vm = new Vue({
                    el:'#app',
                    methods:{
                        r1click(){
                            console.log(this.$refs.r1.msg)
                            this.$refs.r1.show()
                        },
                        r2click(){
                            console.log(this.$refs.r2)
                        },
                    },
                    components:{
                        muban:{
                            template:'<div><h1>你好 世界!</h1></div>',
                            data(){
                                return {
                                    msg:'私有组件数据!'
                                }
                            },
                            methods:{
                                show(){
                                    console.log("这是私有组件,方法")
                                },
                            }
                        },
                    },    
                })
            
            </script>
        </body>
    </html>

    VUE前端路由

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-router.js"></script>
            <link href="css/bootstrap.min.css"/>
            <style type="text/css">
                
                /* router-link默认的class类名 */
                /* 可以在router实例化中 linkActiveCLASS属性自定义class名名 */
                .router-link-active,.mylinkactive{
                    color: orangered;
                    font-weight: 500;
                    font-size: 80px;
                    font-style: italic;
                }
                
                .v-enter,v-leave-to{
                    opacity: 0;
                    transform: translateX(140px);
                }
                
                .v-enter-active,v-leave-active{
                    transition:all 1s ease ;
                }
                
            </style>
        </head>
        <body>
            <!-- 前端路由概念:-->
            <!-- 对于单个应用程序来说,主要通过URL中的hash来实现不同页面之间的切换,同时,hash有一个特点:
            http请求中不会包含hash相关的内容,若依,单页面程序中的页面跳转主要用hash实现.
            在单页面应用程序中,这种通过hash改变来切换页面的方式,称为前端路由 -->
            
            <!-- 这一节总结: -->
            <!--     
            应用vue-route步骤:
            1.创建Vue实例
            2.创建Vuerouter实例
            3.创建组件
            4.vueroute实例中,配置path路径 将组件变量名注册至path路径中
            5.在vue实例中,router属性中 注册vuerouter实例
            6.在vue el中 router-view 展现组件内容,可选项 router-link 模拟动态切换组件
             -->
    
            <!-- 
            URL中的hash(#)
            1.# 的含义:#代表网页中的一个位置,其右边的字符,就是该位置的标识符。
            2.HTTP请求不包含#:#号是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包含#。
            3.#后面的字符:在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。
            4.改变#不触发网页重载:单单改变#后的内容,浏览器只会滚动到相应位置,不会重新加载网页。浏览器不会重新向服务器请求页面。
            5.改变#会改变浏览器的访问历史:每一次改变#后的部分,都会在浏览器的访问历史中增加一个记录,使用"后退"按钮,就可以回到上一个位置。对于ajax应用程序特别有用,可以用不同的#值,表示不同的访问状态,然后向用户给出可以访问某个状态的链接。
    值得注意的是,上述规则对IE 6和IE 7不成立,它们不会因为#的改变而增加历史记录。
            6.window.location.hash读取#值:window.location.hash这个属性可读可写。读取时,可以用来判断网页状态是否改变;写入时,则会在不重载网页的前提下,创造一条访问历史记录。
            7.onhashchange事件:
                这是一个HTML 5新增的事件,当#值发生变化时,就会触发这个事件。IE8+、Firefox 3.6+、Chrome 5+、Safari 4.0+支持该事件。
                它的使用方法有三种:
                1.window.onhashchange = func;
                2.<body onhashchange="func();">
                3.window.addEventListener("hashchange", func, false);
            8.Google抓取#的机制
                默认情况下,Google的网络蜘蛛忽视URL的#部分。
                但是,Google还规定,如果你希望Ajax生成的内容被浏览引擎读取,那么URL中可以使用"#!",Google会自动将其后面的内容转成查询字符串_escaped_fragment_的值。
                比如,Google发现新版twitter的URL如下:
                http://twitter.com/#!/username
                就会自动抓取另一个URL:
                http://twitter.com/?_escaped_fragment_=/username
                通过这种机制,Google就可以索引动态的Ajax内容。
                -->
                
                <div id="app">
                    
                <!--     不推荐
                    <a href="#/login">登录</a>
                    <a href="#/register">注册</a> 
                    -->
                    
                    <!-- router-link 默认渲染成A标签 -->
                    <router-link to='login' tag='span'>登录</router-link>
                    <router-link to='register' tag='span'>注册</router-link>
                    
                    
                    <!-- vue-router 提供的元素,专门用来 当做占位符,将组件展示到router-view中 -->
                    <transition mode='out-in'>
                        <router-view></router-view>
                    </transition>
                    
                    
                </div>
                
                
                
                <script>
                    var login = {
                        template:"<h1>登录组件</h1>"
                    }
                    var register = {
                        template:"<h1>注册组件</h1>"
                    }
                    
                    
                    var routerobj = new VueRouter({
                        // route代表匹配规则
                        routes:[
    //                         每个路由规则,都是一个对象,这个规则对象,身上有两个必须的属性
    //                         属性1 是path,表示监听的那个路由链接地址
    //                         属性2 是component 表示如果路由前面匹配到了path,则展示componnent对应的那个组件
                            {path:'/',redirect:'/login'},
                            {path:'/login',component:login},
                            {path:'/register',component:register},
                            // 注意,component 的属性值,逆序是一个组件的模板对象,而不能是引用组件名称
                        ],
                        linkActiveClass:'mylinkactive',
                    })
                    
                    var vm = new Vue({
                        el:'#app',
                        router:routerobj,
                        // 将路由规则对象,注册到vm实例上,用来监听URL 地址的变化,然后展示对应的组件
                    })
                    
                    
                </script>
        </body>
    </html>

    vue前端路由参数传递

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-router.js"></script>
            <link href="css/bootstrap.min.css"/>
            <style type="text/css">
            
                .router-link-active,.mylinkactive{
                    color: orangered;
                    font-weight: 500;
                    font-size: 80px;
                    font-style: italic;
                }
                .v-enter,v-leave-to{
                    opacity: 0;
                    transform: translateX(140px);
                }
                .v-enter-active,v-leave-active{
                    transition:all 1s ease ;
                }
                
            </style>
        </head>
        <body>
            <div id="app">
                <router-link to='/login' tag='span'>登录</router-link>
                <!-- 第一种传递参数方式: -->
                <router-link to='/login?id=10&name=alex' tag='span'>第一种传递参数方式</router-link>
                <!-- 第二种传递参数方式: 使用过程需要严格匹配路由path-->
                <router-link to='/login/12' tag='span'>第二种传递参数方式</router-link>
                <router-link to='/register' tag='span'>注册</router-link>
            
                <transition mode='out-in'>
                    <router-view></router-view>
                </transition>
            </div>
            <script>
                var login = {
                    template:"<h1>登录组件-{{$route.query.id}}-{{$route.params.id}}-</h1>",
                    created(){
                        
                        console.log('这是$route实例'+this.$route)
    
                        // 第一种传递参数的数据获取:
                        // 这是url?参数的方式 传递数据至$route.query中,多个参数值也是在query中提取.
                        console.log('这是第一种方式传参:'+this.$route.query.id)
                        
                        // 第二种传递参数的数据获取,需要匹配路由规则!!!
                        console.log('这是第二种方式传参:'+this.$route.params.id)
                    },
                }
                var register = {
                    template:"<h1>注册组件</h1>"
                }
                var routerobj = new VueRouter({
                    routes:[
                        {path:'/',redirect:'/login'},
                        {path:'/login',component:login},
                        {path:'/login/:id',component:login},
                        {path:'/register',component:register},
                    ],
                    linkActiveClass:'mylinkactive',
                })
                var vm = new Vue({
                    el:'#app',
                    router:routerobj,
                })
            </script>
        </body>
    </html>

    vue 路由嵌套

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-router.js"></script>
            <link href="css/bootstrap.min.css"/>
        </head>
        <body>
            <div id="app">
                <router-link to='/index'>首页</router-link>
                <router-view></router-view>
            </div>
            
            <template id="shouye">
                <div>
                    <h1>首页</h1>
    <!--             注意:这子路由节点,加/ 或者 不加 / 直接影响匹配的路由路径,
                    当不加的/ 时 访问路径为 /父路径/子路径
                    加了/ 时 访问的路径为 /子路径 -->
                    
                    <!-- 这种是不加斜线的方式 -->
                    <router-link to='/index/login'>登录</router-link>
                    <router-link to='/index/register'>注册</router-link>
                    
                    <!-- 这种是加斜线的方式 -->
    <!--             <router-link to='/login'>登录</router-link>
                    <router-link to='/register'>注册</router-link> -->
                    
                    <router-view></router-view>
                </div>
                
            </template>
            <script>
                var index = {
                    template:'#shouye',
                }
                var login = {
                    template:"<h1>登录组件</h1>",
                }
                var register = {
                    template:"<h1>注册组件</h1>",
                }
                var routerobj = new VueRouter({
                    routes:[
                        {
                            path:'/index',
                            component:index,
                            children:[
                                
    //                             注意:这子路由节点,加/ 或者 不加 / 直接影响匹配的路由路径,
    //                             当不加的/ 时 访问路径为 /父路径/子路径
    //                             加了/ 时 访问的路径为 /子路径
                                // 推荐 子路由不加斜线
                                // 归纳总结:一个是相对路径方式,一个是绝对路径的方式
                                
                                {path:'login',component:login},
                                {path:'register',component:register},
                                
    //                             {path:'/login',component:login},
    //                             {path:'/register',component:register},
                            ],
                        },
                    ],
                })
                var vm = new Vue({
                    el:'#app',
                    router:routerobj,
                })
            </script>
        </body>
    </html>

    vue命名视图 实现经典布局

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-router.js"></script>
            <link href="css/bootstrap.min.css"/>
            <style type="text/css">
                body{
                    margin: 0 auto;
                }
                
                .header{
                    height: 160px;
                    width: 100%;
                    background-color: #00FFFF;
                }
                .container{
                    display: flex;
                    height: 700px;
                    
                }
                .left{
                    background-color: firebrick;
                    flex: 2;
                }
                .main{
                    background-color: yellowgreen;
                    flex: 8;
                }
            </style>
        </head>
        <body>
            <div id="app">
                <router-view name='default'></router-view>
                <div class='container'>
                    <router-view name='left'></router-view>
                    <router-view name='main'></router-view>
                </div>
            </div>
            
            <script>
                var indextop = {
                    template:'<div class="header">banner条</div>',
                }
                var indexlelf = {
                    template:"<div class='left'><ul><li>首页</li><li>事件1</li><li>事件2</li><li>事件3</li><li>事件4</li></ul></div>",
                }
                var indexmain = {
                    template:"<div class='main'>main 内容区域 <router-view></router-view> </div>",
                }
                var routerobj = new VueRouter({
                    
    //                 注意!!!!
    //                 指向单个路由对象使用的是:component,
    //                 指向多个路由对象使用的是:components,
    //                 注意是否加s
                    
                    routes:[
                        {
                            path:'/',
                            components:{
                                'default':indextop,
                                'left':indexlelf,
                                'main':indexmain,
                            },
                        },
                    ],
                })
                var vm = new Vue({
                    el:'#app',
                    router:routerobj,
                    
                })
            </script>
        </body>
    </html>

    VUe监控属性

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="js/vue.js"></script>
            <script src="js/vue-router.js"></script>
            <link href="css/bootstrap.min.css"/>
            
        </head>
        <body>
            <!--     
            wathch、computer 和 methods 之间的对比:
            1.computed 属性的结果会被缓存,除非依赖的响应属性变化才会重新计算,主要当做属性来使用;
            2.methods 方法表示一个具体的操作,主要书写业务逻辑
            3.watch 一个对象,键是需要观察的表达式,值是对应回调函数,主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;
            可以看做computed 和 methods 的结合体. watch提供了新旧值的记录
             -->
            
            
            
            <div id="app">
                <div>
                    <p>第一种实现方式:(keyup + methods方式)</p>
                    <input type="text" v-model="n1" @keyup='getn3' />
                    +
                    <input type="text" v-model="n2" @keyup='getn3' />
                    =
                    <input type="text" v-model="n3" />
                </div>
                
                <div>
                    <p>第二种实现方式:(watch方式)</p>
                    <input type="text" v-model="nn1" />
                    +
                    <input type="text" v-model="nn2" />
                    =
                    <input type="text" v-model="nn3"/>
                </div>
                
                <div>
                    <!-- 在computed 中,可以定一些属性,这些属性叫做 计算属性.
                    本质上是一个方法,但是在使用这些计算属性的时候 是把它的名称直接当做属性来使用
                    并不会把计算属性,当做方法去调用 -->
                    
                    <p>第三种实现方式:(computed方式)</p>
                    <p>注意这里data属性中没有定义nnn3属性,nnn3属性是computed提供的,computed需要返回值</p>
                    <input type="text" v-model="nnn1" />
                    +
                    <input type="text" v-model="nnn2" />
                    =
                    <input type="text" v-model="nnn3"/>
                </div>
                
            </div>
            
            <script>
                var vm = new Vue({
                    el:'#app',
                    data:{
                        n1:'',
                        n2:'',
                        n3:'',
                        
                        nn1:'',
                        nn2:'',
                        nn3:'',
                        
                        nnn1:'',
                        nnn2:'',
                        
                    },
                    methods:{
                        getn3(){
                            this.n3 = this.n1 + '-' + this.n2
                        },
                    },
                    watch:{
                        nn1(){
                            this.nn3 = this.nn1 + '-' + this.nn2
                        },
                        nn2(){
                            this.nn3 = this.nn1 + '-' + this.nn2
                        },
                        // watch提供了新旧值的记录
                        nn3(newvalue,oldvlue){
                            console.log(newvalue,'----',oldvlue)
                        },
                    },
                    computed:{
    //                     'nnn3':function(){
    //                         return this.nnn1 + '-' + this.nnn2
    //                     },
                        
                        nnn3(){
                            return this.nnn1 + '-' + this.nnn2
                        },
                    },
                    
                })
            </script>
        </body>
    </html>

    VUE render函数 模板渲染

    <!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="js/vue.js"></script>
    </head>
    <body>
        <div id="app">
    
            
    
        </div>
        <script>
            var login = {
                template:'<h1>登录组件</h1>'
            };
    
            var vm = new Vue({
                el:'#app',
                data:{},
                methods: {},
                components:{},
                render(h) {
                    return h(login)
                },
            });
        </script>
    </body>
    </html>
  • 相关阅读:
    SQL随记(四)
    一些有用的方法命令
    导航目录
    HTML中&nbsp; &ensp; &emsp; &thinsp;等6种空白空格的区别
    MyBatis学习资料
    Spring Cloud资料
    聚类算法对比
    Spark 读取HBase数据
    ZooKeeper设置ACL权限控制
    大数据工具选择
  • 原文地址:https://www.cnblogs.com/Anec/p/10790657.html
Copyright © 2020-2023  润新知