Vue(二)进阶
本文最后更新于:1 个月前
Vue脚手架:
vue-cli:
全局安装:
npm install -g vue-cli
查看版本:
vue -V
初始化脚手架:
vue init webpack + 项目的名字
运行项目:
npm run dev
打包项目:
npm run build
文件及文件夹的信息:
开发依赖: 开发编译打包需要的依赖,打包之后就不要了
生产依赖: 打包前后都需要的依赖
Vue-router:
下载安装:
npm install vue-router
在router文件夹下新建js文件:
import VueRouter from 'vue-router'//引入路由模块
import Vue from 'vue'
Vue.use(VueRouter)//依赖模块
let router=new VueRouter({
routes:[
{path:'路径(加斜杠访问)',name:"名字(直接访问)",component:'注册组件(跳转的位置)',chidern:[]子路由}
{path:'/',redirect:"/home"},//路由的重定向 如果hash 为'/' 指向到 /home
]
})
export default router
通过
通过
keep-alive:在component组件、router-view外面包裹上keep-alive的话,就会对组件进行缓存,当切换回来的时候,组件会立即渲染,理论来说,切换组件的时候其实会把上一个组件销毁,使用了keep-alive则不会(就是组件一直存在于缓存中)
include匹配到的组件会被缓存,exclude匹配到的不会被缓存
值可以为逗号隔开的字符串include = ‘a,b’;正则:include = ‘/a|b/’;数组:include=[‘a’,’b’]
多级路由:
const routes = [
{path:'/main',component:AppMain},
{path:'/news',component:AppNews,children:[//children是子目录
{path:'inside',component:AppNewsInside},
{path:'outside',component:AppNewsOutside}
]},
]
默认路由:
{path:'',component:Main}//将默认路径设置成Main
动态路由:
{path:'/user/:id',component:User}//id为传的值
命名路由:
直接用name : main在hash中写name就可以路由
路由跳转:
router.push = router-link:to router.replace = router-link:to.replace router.go() = window.history.go
路由钩子:
全局路由钩子:
router.beforeEach((to, from, next) => {
//会在任意路由跳转前执行,next一定要记着执行,不然路由不能跳转了
console.log('beforeEach')
console.log(to,from)
//
next()
})
//
router.afterEach((to, from) => {
//会在任意路由跳转后执行
console.log('afterEach')
})
局部路由:
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
组件内的路由钩子:
beforeRouteEnter (to, from, next) //confirm 前调用
beforeRouteUpdate (to, from, next) //在当前路由改变调用
beforeRouteLeave (to, from, next)//导航离开该组件的对应路由时调用
生命周期:
beforeCreate:
创建组件之前,没有组件,没有元素,没有事件,没有生命周期
created:
创建组件结束,有数据,没有元素
beforeMount:
挂载之前,有数据,没有元素
mounted:
挂载完成,有元素,有数据
beforeUpdate:(在mounted后执行)
用于监听数据变化
updated:
用于监听数据变化
beforeDestroy:
销毁实例,元素数据还在
destroyed:
销毁实例
Vue中的ajax:
axios:
载入:npm install axios
在main.js中
import Axios from 'axios';//引入
Vue.prototype.$axios = Axios;//将Axios附着在Vue,以供全局调用
Axios.defaults.baseURL = 'http://localhost:1024';//设置默认接口地址
然后在需要请求的组件中:
this.$axios
.post("hash",data)//hash是接口地址,不需要加主机地址(http://localhost/index直接写/index)data是传输的对象
.then(res => {//返回值
if (res.data.err == 0) {
console.log(res)
}
})
.catch(err => {
console.log(err);
});
axios拦截器:
请求拦截:
axios.interceptors.request.use(function (config) {//发送之前进行过滤
return config;
}, function (error) {
return Promise.reject(error);
});
响应拦截:
axios.interceptors.response.use(function (response) {//请求到数据后进行过滤
return response;
}, function (error) {
return Promise.reject(error);
});
Vuex:
作用:多个组件共享状态及数据
安装:npm install vuex
配置:在src中新建store文件夹:在里面新建js文件
import Vue from 'vue'
import Vuex from 'vuex'//引入Vuex
Vue.use(Vuex);
import login from './login/index'
const store = new Vuex.Store({
modules: {
login: login,
}
})
export default store;//抛出vuex实例
在src中新建的store文件夹中新建另一个文件夹:里面有5个js文件
大致示范一下里面的内容(部分购物车内容,大概看一下就好):
index.js
import state from './state';
import mutations from './mutations';
import getters from './getters';
import actions from './actions';
let store = {
state,
mutations,
getters,
actions
};
export default store;
state.js
export default {
carObj: [],
}
getters.js
export default {
// 派生属性
all(state) {
var price = 0;
var sum = 0;
var seleceAll = true;
for (let i = 0; i < state.carObj.length; i++) {
if (state.carObj[i].sel) {
price += state.carObj[i].price * state.carObj[i].num;
sum += state.carObj[i].num;
}
seleceAll *= state.carObj[i].sel;
}
return {
price: price,
sum: sum,
seleceAll: seleceAll
}
}
}
mutations.js:
export default {
//只做状态值得修改 不做任何逻辑操作
addTo(state, carObj) {
state.carObj = carObj
}
}
actions.js:
export default {
// // 异步处理逻辑操作
initCar({
commit
}) {
let carlist = localStorage.carlist ? JSON.parse(localStorage.carlist) : [];
commit('addTo', carlist)
}
}
主要流程:(官网的)
初步理解就是:通过actions的函数改变states(数据),渲染到所有绑定的页面,页面再次调用actions(函数),再次修改
深层理解:组件触发actions传递数据(抛发),触发mutations修改状态值,修改state的值,渲染到页面
辅助工具:
import { mapState,mapGetters,mapMutations,mapActions } from 'vuex'
引入辅助工具使组件可以设置或获取到函数及数据
this.$store//获取到store
mapStates:
computed: {
// 使用对象展开运算符将此对象混入到外部对象中
...mapState({
//state中的变量名
})
}
mapGetters:
computed: {
// 使用对象展开运算符将 getter 混入 computed 对象中
...mapGetters([
'doneTodosCount',
'anotherGetter'
])
}
mapMutations:
methods: {
...mapMutations([
'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
// `mapMutations` 也支持载荷:
'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
])
}
mapActions:
methods: {
...mapActions([
'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`
// `mapActions` 也支持载荷:
'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`
])
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!