1. 程式人生 > >Vue的過濾器,生命週期的鉤子函式和使用Vue-router

Vue的過濾器,生命週期的鉤子函式和使用Vue-router

一.過濾器  

1.區域性過濾器 在當前元件內部使用過濾器

  給某些資料 添油加醋

//宣告
filters:{
    '過濾器的名字':function(val,a,b){
        //a 就是alax ,val就是當前的資料
    }
}
//使用  管道符
資料 | 過濾器的名字('alex','wusir')

 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</
title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id="app"> <App /> </div> <script src="vue.js"></script> <script src="moment.js"></script> <script> let App
= { data(){ return { msg:"hello world", time:new Date() } }, template:` <div>我是一個APP {{ msg | myReverse }} <h2>{{ time | myTime('YYYY-MM-DD')}}<
/h2> </div> `, filters:{ myReverse:function (val) { console.log(val); return val.split('').reverse().join('') }, //年-月- 日 年- 月 myTime:function(val,formatStr){ return moment(val).format(formatStr); } } } new Vue({ el:'#app', data(){ return { } }, components:{ App } }) </script> </body> </html>

2.全域性過濾器 只要過濾器一建立,在任何元件中都能使用

Vue.filter('過濾器的名字',function(val,a,b){})
在各個元件中都能使用
資料 | 過濾器的名字('alex','wusir')

 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
    <div id="app">
        <App />
    </div>
    <script src="vue.js"></script>
    <script src="moment.js"></script>
    <script>
        //全域性過濾器
        Vue.filter('myTime',function (val,formatStr) {
            return moment(val).format(formatStr)
        })
        let App = {
            data(){
                return {
                    msg:"hello world",
                    time:new Date()
                }
            },
            template:`

               <div>我是一個APP  {{ msg | myReverse }}
                <h2>{{ time | myTime('YYYY-MM-DD')}}</h2>

               </div>
            `,
            filters:{
                myReverse:function (val) {
                    console.log(val);
                    return val.split('').reverse().join('')
                }

            }
        }
        new Vue({
            el:'#app',
            data(){
                return {

                }
            },
            components:{
                App
            }

        })

    </script>
</body>
</html>

二.生命週期的鉤子函式

created 元件建立

  • 虛擬DOM React

  • 傳送ajax 獲取資料 實現資料驅動檢視

mounted

  獲取真實DOM

activated

  啟用當前元件

deactivated

  • keep-alive Vue提供的內建元件,主要作用,讓元件產生快取

  • 停用當前元件

destroyed

  如果開了定時器,一定要關閉定時器

beforeCreate(){

    // 元件建立之前

    console.log(this.msg);

},

created(){

    // 元件建立之後

    // 使用該元件,就會觸發以上的鉤子函式,created中可以操作資料,傳送ajax,並且可以實現vue==》頁面的影響  應用:傳送ajax請求

    console.log(this.msg);

    // this.msg = '嘿嘿黑';

},

beforeMount(){

    // 裝載資料到DOM之前會呼叫

    console.log(document.getElementById('app'));

},

mounted(){

    // 這個地方可以操作DOM

    // 裝載資料到DOM之後會呼叫 可以獲取到真實存在的DOM元素,vue操作以後的DOM

    console.log(document.getElementById('app'));

},

beforeUpdate(){

    // 在更新之前,呼叫此鉤子,應用:獲取原始的DOM

    console.log(document.getElementById('app').innerHTML);

},

updated(){

    // 在更新之前,呼叫此鉤子,應用:獲取最新的DOM

    console.log(document.getElementById('app').innerHTML);

},

beforeDestroy(){

    console.log('beforeDestroy');

},

destroyed(){

    console.log('destroyed');

},

activated(){

    console.log('元件被激活了');

},

deactivated(){

    console.log('元件被停用了');

}

 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="app">
    <App/>
</div>
<script src="vue.js"></script>

<script>
    let Test = {
        data() {
            return {
                msg: 'alex',
                count:0,
                timer:null
            }
        },
        template: `
               <div id="test">
                    <div id="box">{{ msg }}</div>
                    <p>{{ count }}</p>
                    <button @click = 'change'>修改</button>
               </div>
            `,
        methods: {
            change() {
                this.msg = 'wusir';
                document.querySelector('#box').style.color = 'red';
            }
        },
        beforeCreate() {

            // 元件建立之前
            console.log('元件建立之前', this.msg);

        },
        created() {
//                ********最重要
            // 元件建立之後
//            this.timer = setInterval(()=>{
//                this.count++
//            },1000);

            // 使用該元件,就會觸發以上的鉤子函式,
            // created中可以操作資料,傳送ajax,並且可以實現資料驅動檢視
            // 應用:傳送ajax請求

            console.log('元件建立之後', this.msg);

            // this.msg = '嘿嘿黑';

        },
        beforeMount() {

            // 裝載資料到DOM之前會呼叫

            console.log(document.getElementById('app'));


        },
        mounted() {
//            *******很重要*****

            // 這個地方可以操作DOM

            // 裝載資料到DOM之後會呼叫 可以獲取到真實存在的DOM元素,vue操作以後的DOM

            console.log(document.getElementById('app'));
            //jsDOM操作

        },
        beforeUpdate() {

            // 在更新之前,呼叫此鉤子,應用:獲取原始的DOM

            console.log(document.getElementById('app').innerHTML);

        },
        updated() {

            // 在更新之後,呼叫此鉤子,應用:獲取最新的DOM

            console.log(document.getElementById('app').innerHTML);

        },
        beforeDestroy() {

            console.log('beforeDestroy');

        },
        destroyed() {
            //注意: 定時器的銷燬 要在此方法中處理
            console.log('destroyed',this.timer);
            clearInterval(this.timer);

        },
        activated(){

            console.log('元件被激活了');

        },

        deactivated(){

            console.log('元件被停用了');

        }
    }
    let App = {
        data() {
            return {
                isShow:true
            }
        },
        template: `

               <div>

                   <keep-alive>
                     <Test  v-if="isShow"/>
                  </keep-alive>
                    <button @click = 'clickHandler'>改變test元件的生死</button>
               </div>
            `,
        methods:{
          clickHandler(){
              this.isShow = !this.isShow;
          }
        },
        components: {
            Test
        }

    }
    new Vue({
        el: '#app',
        data() {
            return {}
        },
        components: {
            App
        }

    })

</script>
</body>
</html>

三.Vue的全家桶(kfc) vue+vue-router+vuex

  vue+vue-router 主要來做 SPA(Single Page Application) 單頁面應用

  vue-router是vue的核心外掛

  為什麼要使用單頁面應用?

    傳統的路由跳轉,如果後端資源過多,會導致頁面出現白屏現象,讓前端來做路由,在某個生命週期的鉤子函式中傳送ajax,資料驅動。為了使用者體驗

 

1.使用vue-router

  下載引入

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="app">

</div>
<script src="vue.js"></script>
<script src="vue-router.js"></script>
<script>
    //如果以後是模組化程式設計,Vue.proptotype.$VueRouter = VueRouter
    //    Vue.use(VueRouter)
    const Home = {
        data() {
            return {}
        },
        template: `<div>我是首頁</div>`
    }
    const Course = {
        data() {
            return {}
        },
        template: `<div>我是免費課程</div>`
    }
    //建立路由
    const router = new VueRouter({
        //定義路由規則
        mode:'history',
        routes: [
            {
              path:'/',
              redirect:'/home'
            },
            {
                path: '/home',
                component: Home
            },
            {
                path: '/course',
                component: Course
            }
        ]
    })
    let App = {
        data() {
            return {}
        },
//        router-link和router-view 是vue-router 提供的兩個全域性元件
        //router-view  是路由元件的出口
        template: `
            <div>

                <div class="header">
                    <router-link to = '/home'>首頁</router-link>
                    <router-link to = '/course'>免費課程</router-link>
                </div>
                <router-view></router-view>
            </div>

        `

    }
    new Vue({
        el: '#app',
        //掛載 路由物件
        router,
        data() {
            return {}
        },
        template: `<App />`,
        components: {
            App
        }
    })

</script>

</body>
</html>

2.命名路由

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="app">

</div>
<script src="vue.js"></script>
<script src="vue-router.js"></script>
<script>
    //如果以後是模組化程式設計,Vue.proptotype.$VueRouter = VueRouter
    //    Vue.use(VueRouter)
    const Home = {
        data() {
            return {}
        },
        template: `<div>我是首頁</div>`
    }
    const Course = {
        data() {
            return {
                categoryList:[]
            }
        },
        template: `<div>
        <span v-for = '(item,index) in categoryList'>{{item.name}}</span>



    </div>`,
        methods:{
          getCategroyList(){

          }
        },
        created(){
            //ajax 傳送請求 資料獲取
            this.getCategroyList();
        }
    }
    //建立路由
    const router = new VueRouter({
        //定義路由規則
        routes: [
            {
              path:'/',
              redirect:'/home'
            },
            {
                path: '/home',
                name:'Home',
                component: Home
            },
            {
                path: '/course',
                name:'Course',
                component: Course
            }
        ]
    })
    let App = {
        data() {
            return {}
        },
//        router-link和router-view 是vue-router 提供的兩個全域性元件
        //router-view  是路由元件的出口
        template: `
            <div>

                <div class="header">
                    <router-link :to = '{name:"Home"}'>首頁</router-link>
                    <router-link :to = '{name:"Course"}'>免費課程</router-link>
                </div>
                <router-view></router-view>
            </div>

        `

    }
    new Vue({
        el: '#app',
        //掛載 路由物件
        router,
        data() {
            return {}
        },
        template: `<App />`,
        components: {
            App
        }
    })

</script>

</body>
</html>

3.動態路由匹配

  $route 路由資訊物件

  $router 路由物件 VueRouter

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="app">

</div>
<script src="vue.js"></script>
<script src="vue-router.js"></script>
<script>
    //如果以後是模組化程式設計,Vue.proptotype.$VueRouter = VueRouter
    //    Vue.use(VueRouter)

    //路由正規化:

    //http://127.0.0.1:8080/index/user
    //http://127.0.0.1:8080/user/1 params
    //http://127.0.0.1:8080/user/2
    //http://127.0.0.1:8080/user?user_id =1   query


    const User = {
        data() {
            return {
                user_id:null
            }
        },
        template: `<div>我是使用者{{ user_id}}</div>`,
        created() {
            console.log(this.$route); //路由資訊物件
//            提醒一下,當使用路由引數時,例如從 /user/foo 導航到 /user/bar,原來的元件例項會被複用。因為兩個路由都渲染同個元件,比起銷燬再建立,複用則顯得更加高效。不過,這也意味著元件的生命週期鉤子不會再被呼叫。
        },
        watch: {
            '$route'(to, from) {
                // 對路由變化作出響應...
                console.log(to.params.id);
                console.log(from);
                this.user_id = to.params.id;
                //傳送ajax

            }
        }
    }

    //建立路由
    const router = new VueRouter({
        //定義路由規則
        routes: [

            {
                path: '/user/:id',
                name: 'User',
                component: User
            }

        ]
    })
    let App = {
        data() {
            return {}
        },
//        router-link和router-view 是vue-router 提供的兩個全域性元件
        //router-view  是路由元件的出口
        template: `
            <div>

                <div class="header">
                    <router-link :to = '{name:"User",params:{id:1}}'>使用者1</router-link>
                    <router-link :to = '{name:"User",params:{id:2}}'>使用者2</router-link>

                </div>
                <router-view></router-view>
            </div>

        `

    }
    new Vue({
        el: '#app',
        //掛載 路由物件
        router,
        data() {
            return {}
        },
        template: `<App />`,
        components: {
            App
        }
    })

</script>

</body>
</html>

4.程式設計式導航

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="app">

</div>
<script src="vue.js"></script>
<script src="vue-router.js"></script>
<script>
    //如果以後是模組化程式設計,Vue.proptotype.$VueRouter = VueRouter
    //    Vue.use(VueRouter)

    //路由正規化:

    //http://127.0.0.1:8080/index/user
    //http://127.0.0.1:8080/user/1 params
    //http://127.0.0.1:8080/user/2
    //http://127.0.0.1:8080/user?user_id =1   query
    const Home = {
        data() {
            return {}
        },
        template: `<div>我是首頁</div>`
    }

    const User = {
        data() {
            return {
                user_id: null
            }
        },
        template: `<div>我是使用者{{ user_id}}
                    <button @click = 'clickHandler'>跳轉首頁</button>

                 </div>`,
        created() {
            console.log(this.$route);
        },
        methods:{
            //程式設計式導航
            clickHandler(){
                this.$router.push({
                    name:"Home"
                })
            }
        },
        watch: {
            '$route'(to, from) {
                // 對路由變化作出響應...
                console.log(to.params.id);
                console.log(from);
                this.user_id = to.params.id;
                //傳送ajax

            }
        }
    }

    //建立路由
    const router = new VueRouter({
        //定義路由規則
        routes: [

            {
                path: '/user/:id',
                name: 'User',
                component: User
            },
            {
                path: '/home',
                name: 'Home',
                component: Home
            }

        ]
    })
    let App = {
        data() {
            return {}
        },
//        router-link和router-view 是vue-router 提供的兩個全域性元件
        //router-view  是路由元件的出口
        template: `
            <div>

                <div class="header">
                    <router-link :to = '{name:"User",params:{id:1}}'>使用者1</router-link>
                    <router-link :to = '{name:"User",params:{id:2}}'>使用者2</router-link>

                </div>
                <router-view></router-view>
            </div>

        `

    }
    new Vue({
        el: '#app',
        //掛載 路由物件
        router,
        data() {
            return {}
        },
        template: `<App />`,
        components: {
            App
        }
    })

</script>

</body>
</html>