Vue.js学习总结第六天

Vue.js学习总结第六天

一、使用children属性实现路由的嵌套

通俗地说就是组件里面也有路由规则,大组件里面套小组件,根据路由情况有选择的展示某些小组件

使用步骤:

①在父组件里面写 <router-link to="/account/login"时,一定要带上父组件的路由

②在路由规则对象定义里要给相应父组件对象映射规则下加上children属性,children属性里面写子路由信息

<html>
    <head>
        <meta charset='utf-8'>
        <title></title>
        <!-- 引入vue.js -->
        <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
        <!-- 引入路由模块 -->
        <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    </head>
    <body>
        <div id='app'>  //当我们点击“Account”时, <router-view>会展示account组件对象
            <router-link to="/account">Account</router-link>
            <router-view></router-view>
        </div>
        <template id="tmp1">
            <div>
                <h1>这是account组件</h1> //以“/account/login”可以实现在父路由为account的情况下,去访问父路由account下的子路由login
                <router-link to="/account/login">登录</router-link> | 
                <router-link to="/account/register">注册</router-link>
                <router-view></router-view>
            </div>
        </template>
    </body>
    <script>
        var account = {
            template:"#tmp1"
        }
        var login = {
            template:"<h1>登录组件</h1>"
        }
        var register = {
            template:"<h1>注册组件</h1>"
        }
        var router = new VueRouter({
            routes:[
                {
                	path:'/account',
                	component:account,
   //使用children属性,实现子路由,同时,子路由的path前面,不要带/,否则永远以根路径
    //开始请求,这样不方便我们用户去理解url地址
                    children:[ 
                    {path:'login',component:login},//path开头不要加“/”
                    {path:'register',component:register}
                ]
                   },            
            ]
        })
        // 实例化vue对象
        let vm = new Vue({
            // 绑定对象
            el:'#app',
            data:{
                
            },
            methods:{
                
            },
            router
        })
    </script>
</html>

二、路由-命名视图实现经典布局

通俗的话就是说让<router-view有针对性,某些<router-view只展示某些组件

使用步骤:

①给<router-view设置name值,

②在router路由对象里面配置 path规则

<html>
    <head>
        <meta charset='utf-8'>
        <title></title>
        <!-- 引入vue.js -->
        <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
        <!-- 引入路由模块 -->
        <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
        <style>
            *{
                margin:0;
                padding: 0;
            }
            .header{
                background: red;
                height: 100px;
            }
            .container{
                display:flex;
                height: 500px;
            }
            .left{
                background: lightblue;
                flex:2;
            }
            .main{
                background: lightsalmon;
                flex:8;
            }
        </style>
    </head>
    <body>
        <div id='app'>
            <router-view></router-view>
            <div class="container">  //如果给router-view指定了name值,那么展示指定的组件,到router路由对象里面找与之对应的组件(根据path规则找)
                <router-view name="left"></router-view>
                <router-view name="main"></router-view>
            </div>           
        </div>    
    </body>
    <script>
        let header = {
            template:"<h1 class='header'>Header头部区域</h1>"
        }
        let leftBox = {
            template:"<h1 class='left'>leftBox侧边栏区域</h1>"
        }
        let mainBox = {
            template:"<h1 class='main'>MainBox主体区域</h1>"
        }
        let router = new VueRouter({
            routes:[
                {path:'/',components:{ //要注意到这里的component带了s,components
                    'default':header,//给上面<router-view>指定默认展示的组件
                    'left':leftBox,
                    'main':mainBox
                }},
            ]
        })
        // 实例化vue对象
        let vm = new Vue({
            // 绑定对象
            el:'#app',
            data:{               
            },
            methods:{                
            },
            router  //其实是router:router的简写
        })
    </script>
</html>

运行效果截图:

三、使用watch监听文本框数据的变化

watch的作用:监听绑定的文本框的数据的变化,一旦变化,就立刻触发watch后的function

使用步骤:

①在vue对象里面指定watch属性,然后在watch属性里对需要绑定的元素(vue对象的data属性里有很多数据都可以被监听)做监听配置

<html>
    <head>
        <meta charset='utf-8'>
        <title></title>
        <!-- 引入vue.js -->
        <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
    </head>
    <body>
        <div id='app'>
            <!-- 分析 1、监听到文本框的改变  -->
            <h2>第一个</h2>
            <input type="text" v-model="firstname" @keyup="getFullname"> + 
            <input type="text" v-model="lastname" @keyup="getFullname"> = 
            <input type="text" v-model="fullname">
        </div>   
    </body>
    <script>
        // 实例化vue对象
        let vm = new Vue({
            // 绑定对象
            el:'#app',
            data:{
                firstname:'',
                lastname:'',
                fullname:'',
            },
            methods:{
                getFullname(){
                    this.fullname = this.firstname + '-' + this.lastname
                }
            },
            // 使用watch可以监视 data 中指定数据的变化,然后触发这个 watch 中对应的function处理函数
            watch:{
                'firstname':function(newVal,oldVal){
                    console.log("new:"+newVal+"--old:"+oldVal)
                    this.fullname = this.firstname + '-' + this.lastname
                },
                'lastname':function(newVal){
                    this.fullname = this.firstname + '-' + newVal
                }
            },
        })
    </script>
</html>

运行效果截图:

四、使用watch监听路由地址的改变

目的:我们点击不同的按钮就会在本页面进行不同的路由,路由地址会产生变化,这个时候我们可以对路由地址做监听

使用步骤:

①在vue对象里面写watch属性,并对其进行配置"$route.path":function(newVal,oldVal)

<html>
    <head>
        <meta charset='utf-8'>
        <title></title>
        <!-- 引入vue.js -->
        <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
        <!-- 引入路由模块 -->
        <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
    </head>
    <body>
        <div id='app'>
            <router-link to="/login">登录</router-link>
            <router-link to="/register">注册</router-link>
            <router-view></router-view>
        </div>  
    </body>
    <script>
         // 创建组件模板对象
         var login = {
            template:"<h1>登录组件</h1>",      
        }
        var register = {
            template:"<h1>注册组件</h1>",
        }
        var router = new VueRouter({
            routes:[
                {path:'/',redirect:'login'},
                {path:'/login',component:login},
                {path:'/register',component:register}
            ]
        })
        // 实例化vue对象
        let vm = new Vue({
            // 绑定对象
            el:'#app',
            data:{                
            },
            methods:{               
            },
            router,
            watch:{   //$route.path 是路由路径,下面是做对路由路径变化的监听配置
                //下面的newVal是指新的路由路径,oldVal是指旧的路由路径
                "$route.path":function(newVal,oldVal){
                    console.log("new:"+newVal+"--old:"+oldVal)
                    if(newVal == "/login"){
                        console.log("欢迎进入登录页面")
                    }else if(newVal == "/register"){
                        console.log("欢迎进入注册页面")
                    }
                }
            }
        })
    </script>
</html>

运行效果截图:

五、computed计算属性的使用

效果:每次我们修改firstname或者lastname 文本框时,fullname文本框也会跟着变化

使用步骤:

①在vue对象中写computed属性:然后配置相应的“计算属性”,比如本例里面配置“fullname”属性,然后与<div id下的fullname文本框绑定, 然后在computed里给fullname配置相应的function即可

<html>
    <head>
        <meta charset='utf-8'>
        <title></title>
        <!-- 引入vue.js -->
        <script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
    </head>
    <body>
        <div id='app'>
            <!-- 分析 1、监听到文本框的改变  -->
            <input type="text" v-model="firstname" > + 
            <input type="text" v-model="lastname" > = 
            <input type="text" v-model="fullname">
            <p>{{fullname}}</p>  //这里虽然引用了3次fullname,但是fullname对应的function里使用到                   //的数据都没有变化,所以不管我们怎么引用fullname都不会触发fullname对应的function
            <p>{{fullname}}</p>
            <p>{{fullname}}</p>
        </div>   
    </body>
    <script>
        // 实例化vue对象
        var vm = new Vue({
            // 绑定对象
            el:'#app',
            data:{
                firstname:'',
                lastname:'',
            },
            methods:{          
            },
            computed:{ //在computed中,可以定义一些属性,这些属性可以与我们的input标签绑定,
            	 //我们在这里给属性添加方法,作用就是“只要该属性function里用到的某一个data数据发生变化,
            	 //都会重新触发该方法返回新值,然后展示到绑定的input标签中去”,我们把之称为“计算属性”
            	 //注意1:“计算属性”,在引用的时候一定不要加()去调用,直接把它当作普通属性去使用就好,
            	 //注意2:“计算属性”的求值结果,会被缓存起来,方便下次直接使用;只要该计算属性方法里用                   //到的数据都没有发生变化,就不会重新触发该方法调用
            	'fullname':function(){
            		console.log('ok'); //一旦firstname或者lastname发生变化,立马触发这个                       //function,然后刷新fullname文本框的值
            		return this.firstname+'-'+this.lastname;
            	}
            }
        })
    </script>
</html>

运行结果截图: 解释一下控制台的两个ok分别是我们输入firstname和lastname而触发fullname对应的function,而我们在上面代码中虽然多次写了<p{{fullname}}</p 但是由于fullname :function里用到的数据没有发生变化,所以不会触发fullname :function

猜你喜欢

转载自blog.csdn.net/qq_40241957/article/details/89743017