vue2学习笔记3
2021.01.28
le31ei
Program
 热度
℃
1. vue-router
- 创建路由组件
- 配置路由映射: 组件和路径映射关系
- 使用路由: 通过
<router-link>
和<router-view>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import Vue from 'vue' import VueRouter from 'vue-router' import Home from "@/components/Home"; import About from "@/components/About";
Vue.use(VueRouter)
const routes = [ { path: '', redirect: '/home' }, { path: '/home', component: Home }, { path: '/about', component: About }, ]
const router = new VueRouter({ routes, mode: 'history' }) export default router
|
路由模式更换
默认格式:http://localhost:8080/#/home
history模式: http://localhost:8080/home
1 2 3 4
| const router = new VueRouter({ routes, mode: 'history' })
|
router-link属性
- tag属性:可以指定
<router-link>
渲染成什么组件,比如<li>
- to属性:跳转到某个url
- replace属性:替换模式,不能使用浏览器前进后退按钮
- Active-class属性:选中的router-link有
router-link-active
的class属性,将router-link-active
更名
代码跳转路由
this.$router.push('/home')
this.$router.replace('/home')
动态路由
获取路由参数:this.$route.params.id
1 2 3 4 5 6
| const routes = [ { path: '/user/:id', component: User } ]
|
懒加载
当用户访问到路由的时候才加载响应的组件,更加高效
1 2 3 4
| { path: '/home', component: () => import('../components/Home') },
|
路由嵌套
- 创建对应子组件,并在路由上配置对应的子路由
- 在组件内部使用
<router-view>
标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| { path: '/home', component: () => import('../components/Home'), children: [ { path: 'news', component: HomeNews }, { path: 'message', component: HomeMessage } ] }, <router-link to="/home/news">新闻</router-link> <router-link to="/home/message">消息</router-link> <router-view></router-view>
|
参数传递
query方式:profile?id=1:
<router-link :to="{path: '/profile', query: {id: '1'}}">Profile</router-link>
js方式:
1 2 3 4 5 6
| this.$router.push({ path: 'profile', query: { name: '1' } })
|
取值方式:this.$router.query.id
路径方式:
<router-link :to="/user/+userid">用户</router-link>
js方式:
this.$router.push('/profile'+ this.userid)
导航守卫
title更换为对应页面的title
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { path: 'message', component: HomeMessage, meta:{ title: 'message' } router.beforeEach((to, from, next) => { document.title = to.meta.title next() })
|
2. promise
异步编程解决方案
promise本身是一个类,传入的箭头函数参数resolve和reject也是两个函数,成功的时候调用resolve,失败的时候调用reject,
成功的处理代码写在then中,失败的代码写在catch中
1 2 3 4 5 6 7 8 9 10 11 12
| new Promise((resolve, reject) => { setTimeout(() => { console.log('请求') reject() }, 1000) }).then(() => { console.log('success')
}).catch(() => { console.log('failed') })
|
三种状态
pending:等待状态,比如正在进行网络请求,或者定时器没有到指定时间
Fulfill: 满足状态,比如主动调用了resolve,就处于该状态,并且回调.then()
reject: 拒绝状态,当我们主动回调了reject时,就处于该状态,并且回调.catch()
链式调用
promise可以直接省略
1 2 3 4 5 6 7 8 9 10 11 12 13
| new Promise((resolve, reject) => { setTimeout(()=> { resolve('aaa') }, 1000) }).then(res => { console.log(res) return Promise.resolve(res+ '222') }).then(res => { console.log(res) return res+'3333' }).then(res => { console.log(res) })
|
等待同步请求: promise.all
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Promise.all([ new Promise((resolve, reject) => { setTimeout(() => { resolve('请求1') }, 1000) }), new Promise((resolve, reject) => { setTimeout(() => { reject('请求2失败') }, 2000) }) ]).then(results => { console.log(results[0]) console.log(results[1]) }).catch(err => { console.log(err) })
|
3. vuex
状态管理模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import Vue from 'vue' import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({ state: { counter: 1000 }, mutations: { increament(state){ state.counter ++ }, decreament(state){ state.counter -- } }, actions: {
}, getters: {
}, modules: {
} })
export default store
|
调用的时候需要通过commit进行调用
1 2 3
| this.$store.commit('increament', )
this.$store.commit('increament', 5)
|
state
单一状态树,全部状体放在一个store里面
getters
对state的数据进行变形后输出,类似于计算属性
调用方法:
$store.getters.doubleCounter
1 2 3 4 5
| getters: { doubleCounter(state, getters){ return state.counter * state.counter } },
|
响应式操作state
1 2
| Vue.set(state.info, 'age', 40) Vue.delete(state.info, 'age')
|
mutations
只能存放同步操作,不能使用异步操作,存在异步操作使用actions
actions
存放异步操作,但是只能调用mutations里面的同步函数,对state进行操作
1 2 3 4 5 6 7
| actions: { aUpdateInfo(context){ setTimeout(() => { context.commit('updateInfo') }, 1000) } },
|
调用方法:this.$store.dispatch('aUpdateInfo')
modules
对state中的数据进行分模块
1 2 3 4 5 6 7 8
| modules: { a: { actions: {}, mutations: {}, getters: {}, state: {} } }
|