Vue框架入门学习(二)——Vue修饰符

三、Vue进阶用法

1.事件修饰符

指针对于v-on事件产生的修饰符,例如说.stop可以让操作停止

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="div1">
    <div class="" @click="fn1()">
        <input type="button" value="按钮" @click.stop="fn2()">
    </div>
</div>

</body>
<script>
    let vm = new Vue({
        el:'#div1',
        data:{

        },
        methods:{
            fn1(){
                alert('11');
            },
            fn2(){
                alert('22');
            }
        }
    });
</script>
</html>

接下来对于几个事件修饰符进行举例
stop 禁止冒泡
once 单次事件
prevent 阻止默认事件
native 原生事件(原生环境下new Vue方法无法使用)
keycode|name 控制键盘按键

prevent,once

        <form action="2.v_bind.html" method="post" @submit.prevent.once="submit()">
            <!--        设置一个页面的跳转事件,但是仅仅可以提交一次,且不会跳转页面,仅仅做提交信息的操作-->
            <input type="submit" value="提交">
        </form>

keydown

<input type="text" @keydown.enter="fn()">

由回车来控制提交

<div id="div1">
        <input type="text" @keydown.enter.ctrl="fn()">
    </div>

由组合键来控制提交

2.computed—计算属性

与method的实现有一定区别
不主动计算,有缓存,当数据改变的时候才会重新计算,性能更高

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Computed</title>
    <script src="vue.js" charset="utf-8"></script>
</head>
<body>
    <div id="div1">
        姓:<input type="text" v-model="familyName">
        名:<input type="text" v-model="Name">
        <input type="text" v-model="sum">
    </div>
</body>
<script>
    let vm = new Vue({
        el:'#div1',
        data:{
            familyName:'张',
            Name:'章'
        },
        computed: {
            sum:{
                get() {
                    return this.familyName + this.Name;
                },
                set(value) {
                    this.familyName=value[0];
                    this.Name=value.substring(1)
                }
            }
        }
    });
</script>
</html>

3.watch—监听属性

在这里要强调保证属性一直才能达到监听的效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Computed</title>
    <script src="vue.js" charset="utf-8"></script>
</head>
<body>
<div id="div1">
    <input type="text" v-model="user_info.name">
</div>
</body>
<script>
    let vm = new Vue({
        el:'#div1',
        data:{
            user_info:{
                name:'blue',
                age:18
            }
        },
        watch:{
            'user_info.name':function() {//user_info的某一个属性,watch的属性,v-model的属性三者要保持一致
                console.log('name 变了')
            }
        }
    });
</script>
</html>

※4.Vue-router

1.容器
<router-view></router-view>
2.路由表

let router = new VueRouter({
        routes:[
            {
                path:,
                component:{}
            }
        ]
    });

3.添加到vm对象,el,data,methods,···
举例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>router</title>
    <script src="vue.js" charset="utf-8"></script>
    <script src="vue-router.js" charset="utf-8"></script>
</head>
<body>
    <div id="div1">
        文字
        <!--1.有了一个路由的容器-->
        <router-view></router-view>
    </div>
</body>
<script>
     //2.配置路由表
    let router = new VueRouter({
        routes:[
            {
                path:'/a',
                component:{template:'<div>aaaaa</div>'}
            },
            {
                path:'/b',
                component:{template:'<div>bbbbb</div>'}
            },
            {
                path:'/c',
                component:{template:'<div>ccccc</div>'}
            }
        ]
    });

    let vm = new Vue({
        el:'#div1',
        data:{},
        //将路由表添加到vm中,通过地址去填充router-view
        router:router
    });
</script>
</html>

由于我们在这里操作的用手动修改域名的方式来进行页面的跳转,所以在这里我们也可以创建href进行手动跳转

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>router</title>
    <script src="vue.js" charset="utf-8"></script>
    <script src="vue-router.js" charset="utf-8"></script>
</head>
<body>
    <div id="div1">
        <a href="#/a">页面1</a>
        <a href="#/b">页面2</a>
        <a href="#/c">页面3</a>
        文字
        <!--1.有了一个路由的容器-->
        <router-view></router-view>
    </div>
</body>
<script>
     //2.配置路由表
    let router = new VueRouter({
        routes:[
            {
                path:'/a',
                component:{template:'<div>aaaaa</div>'}
            },
            {
                path:'/b',
                component:{template:'<div>bbbbb</div>'}
            },
            {
                path:'/c',
                component:{template:'<div>ccccc</div>'}
            }
        ]
    });

    let vm = new Vue({
        el:'#div1',
        data:{},
        //将路由表添加到vm中,通过地址去填充router-view
        router:router
    });
</script>
</html>

但是这里我们写href又感觉很原始,其实router里面封装了router-link能方便我们进行页面的跳转

		<router-link to="/a">页面1</router-link>
        <router-link to="/b">页面2</router-link>
        <router-link to="/c">页面3</router-link>

PS:用#可以防止页面刷新
在router-link内给按钮加样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>router</title>
    <script src="vue.js" charset="utf-8"></script>
    <script src="vue-router.js" charset="utf-8"></script>
    <style media="screen">
        .links {overflow:hidden;}
        .links .nav {float:left; color: aqua;margin-right:10px}
        .links .router-link-active {
            color: blueviolet;}
    </style>
</head>
<body>
    <div id="div1">
        <div class="links">
            <router-link class="nav" to="/a">页面1</router-link>
            <router-link class="nav" to="/b">页面2</router-link>
            <router-link class="nav" to="/c">页面3</router-link>
        </div>
        文字
        <!--1.有了一个路由的容器-->
        <router-view></router-view>
    </div>
</body>
<script>
     //2.配置路由表
    let router = new VueRouter({
        routes:[
            {
                path:'/a',
                component:{template:'<div>aaaaa</div>'}
            },
            {
                path:'/b',
                component:{template:'<div>bbbbb</div>'}
            },
            {
                path:'/c',
                component:{template:'<div>ccccc</div>'}
            }
        ]
    });

    let vm = new Vue({
        el:'#div1',
        data:{},
        //将路由表添加到vm中,通过地址去填充router-view
        router:router
    });
</script>
</html>

5.命名路由

若router path太复杂,就可以选择给router进行命名,而且路由的选择根据举例来决定
顺便加入了一些样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>router</title>
    <script src="vue.js" charset="utf-8"></script>
    <script src="vue-router.js" charset="utf-8"></script>
    <style media="screen">
        .links {overflow:hidden;}
        .links .nav {float:left; color: aqua;margin-right:10px}
        .links .router-link-active {
            color: blueviolet;}
    </style>
</head>
<body>
    <div id="div1">
        <div class="links">
            <router-link class="nav" :to="{name:'aaa',params:{id:55}}">页面1</router-link>
            <router-link class="nav" to="/b">页面2</router-link>
            <router-link class="nav" to="/c">页面3</router-link>
        </div>
        文字
        <!--1.有了一个路由的容器-->
        <router-view></router-view>
    </div>
</body>
<script>
     //2.配置路由表
    let router = new VueRouter({
        routes:[
            {
                path:'/news/:id',
                name:'aaa',
                component:{template:'<div>新闻:{{$route.params.id}}</div>'}
                //route 路由信息
            },
            {
                path:'/b',
                name:'bbb',
                component:{template:'<div>bbbbb</div>'}
            },
            {
                path:'/c',
                name:'ccc',
                component:{template:'<div>ccccc</div>'}
            }
        ]
    });

    let vm = new Vue({
        el:'#div1',
        data:{},
        //将路由表添加到vm中,通过地址去填充router-view
        router:router
    });
</script>
</html>

6.JS控制路由跳转

之前提到了,获取id的时候我们使用的是$route
而使用js来控制路由跳转,使用的是 $router

首先先创建一个事件,导向定义好的路由地址,根据路由地址对应的template去填充router-view,而如果是参数,就通过调用的函数找到对应的参数后再填充。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>router</title>
    <script src="vue.js" charset="utf-8"></script>
    <script src="vue-router.js" charset="utf-8"></script>
    <style media="screen">
        .links {overflow:hidden;}
        .links .nav {float:left; color: aqua;margin-right:10px}
        .links .router-link-active {
            color: blueviolet;}
    </style>
</head>
<body>
    <div id="div1">
        <div class="links">
            <input type="button" value="页面1" @click="fn1()">
            <input type="button" value="页面2" @click="fn2()">
            <input type="button" value="页面3" @click="fn3()">
        </div>
        文字
        <!--1.有了一个路由的容器-->
        <router-view></router-view>
    </div>
</body>
<script>
     //2.配置路由表
    let router = new VueRouter({
        routes:[
            {
                path:'/news/:id',
                name:'news',
                component:{
                    template:'<div>新闻:{{$route.params.id}}</div>'
                }
                //route 路由信息
            },
            {
                path:'/b',
                name:'bbb',
                component:{
                    template:'<div>bbbbb</div>'
                }
            },
            {
                path:'/c',
                name:'ccc',
                component:{
                    template:'<div>ccccc</div>'
                }
            }
        ]
    });

    let vm = new Vue({
        el:'#div1',
        data:{},
        //将路由表添加到vm中,通过地址去填充router-view
        router:router,
        methods:{
            fn1() {
                this.$router.push({
                    name:'news',
                    params:{
                        id:22
                    }
                });
            },
            fn2() {
                this.$router.push('/b');
            },
            fn3() {
                this.$router.push('/c');
            }
        }
    });
</script>
</html>

7.监视路由

使用watch来实现路由监视的功能

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <script src="vue.js" charset="utf-8"></script>
    <script src="vue-router.js" charset="utf-8"></script>
    <style media="screen">
    .links {overflow:hidden;}
    .links .nav {float: left; color:#CCC; margin-right:10px}
    .links .router-link-active {color:black;}
    </style>
  </head>
  <body>
    <div id="div1">
      <div class="links">
        <input type="button" value="页面1" @click="fn1()">
        <input type="button" value="页面2" @click="fn2()">
        <input type="button" value="页面3" @click="fn3()">
      </div>
      文字
      <!--1.路由容器-->
      <router-view></router-view>
    </div>
  </body>

  <script>
  //2.路由表
  let router=new VueRouter({
    routes: [
      {
        path: '/news/aaa/',
        component: {
          template: '<div>新闻2</div>'
        }
      },
      {
        path: '/news/:id/',
        name: 'news',
        component: {
          template: '<div>新闻:{{$route.params.id}}</div>'
        }
      },

      {
        path: '/b',
        component: {template: '<div>bbbbb</div>'}
      },
      {
        path: '/c',
        component: {template: '<div>cccccc</div>'}
      }
    ]
  });

  let vm=new Vue({
    el: '#div1',
    data: {},
    methods: {
      fn1(){
        this.$router.push('/news/19');
        //this.$router.replace({name: 'news', params: {id: Math.random()}});
      },
      fn2(){
        this.$router.push('/b');
      },
      fn3(){
        this.$router.push('/c');
      }
    },
    router,
    watch: {
      $route(value, old_value){
        console.log(value, old_value);
      }
    }
  });
  </script>
</html>

但用watch进行路由监视不推荐,因为只能看,无法干预,官方更推荐使用路由守卫,因为可以进行干预。

8.多视图

使用多个router-view,用name去进行标注

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
    <meta charset="utf-8">
    <title></title>
    <script src="vue.js" charset="utf-8"></script>
    <script src="vue-router.js" charset="utf-8"></script>

</head>
<body>
<div id="div1">
    <div class="links">
        <router-link to="/">首页</router-link>
        <router-link to="/news">新闻</router-link>
    </div>
    <!--1.路由容器-->
    <router-view name="header"></router-view>
    <router-view></router-view><!--默认视图default-->
    <router-view name="footer"></router-view>
</div>
</body>

<script>
    const headerCmp = {
        template:'<div>头部</div>'
    };
    const footerCmp = {
        template:'<div>底部</div>'
    };
    const newsCmp = {
        template: '<div>新闻</div>'
    };
    const userCmp = {
        template: '<div>用户</div>'
    };
    const indexCmp = {
        template: '<div>首页</div>'
    };


    //2.路由表
    let router=new VueRouter({
        routes: [
            {
                path:'/',
                name:'index',
                //完成视图对应的工作,以router-view的name与声明的变量进行配对
                components: {
                    default:indexCmp,//默认视图
                    header:headerCmp,
                    footer:footerCmp
                }
            },
            {
                path:'/news',
                name:'news',
                components:{
                    default:newsCmp,
                    header:headerCmp,
                    footer:footerCmp
                }
            }
        ]
    });

    let vm=new Vue({
        el: '#div1',
        data: {},
        methods: {
        },
        router
    });
</script>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值