Vue的過濾器,生命週期的鉤子函式和使用Vue-router
阿新 • • 發佈:2018-11-28
一.過濾器
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>
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>
二.生命週期的鉤子函式
-
-
傳送ajax 獲取資料 實現資料驅動檢視
獲取真實DOM
啟用當前元件
-
-
停用當前元件
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+vue-router 主要來做 SPA(Single Page Application) 單頁面應用
vue-router是vue的核心外掛
為什麼要使用單頁面應用?
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>