cnpm install vue-router -S
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter) // 路由注册
export default new VueRouter({
routes: []
})
import router from './router.js'
new Vue({
router
})
// 定义路由匹配规则
const routes = [
{ path: '/home', component: Home },
{ path: '/user', component: User },
{ path: '/find', component: Find }
]
路由匹配规则的写法:{path: ‘/detail/:id’, component: ‘’, props: true }
两种路由参数传参的方式:$route / props
视图命名:当加了name属性时,在路由匹配规则定义时要使用 components 字段。
实际应用:登录页和Layout(系统内页)是有你无我的。他俩敌人(兄弟)关系。
但是Login页面也需要通过 /#/login 路由的方式进行访问,也需要把 Login加入到路由系统中。
为了避免Login 和 其它所谓的 pages 页面抢那个名字叫default的椅子(router-view)。
所以,当我们把Login加入到路由系统中时,给它一个VIP专座(名字叫login的router-view)来展示,放在App.vue中。
components: {
abc: Home,
efg: Find,
default: MusicList
}
name: 'me'
alias: '/u'
是一种性能优化的方案,是导入组件的一种写法,使用webpack代码分割功能和异步组件的特点来实现
const Home = ()=>import('./home/Home.vue')
const User = ()=>import('./user/User.vue')
const Find = ()=>import('./home/Find.vue')
异步组件
Vue.component('qf-async', (resolve, reject)=>{
setTimeout(()=>{
resolve({
template: ``,
methods: {}
})
}, 2000)
})
即,被 承载的组件中还可以再使用 ,形成嵌套关系。 在路由匹配规则中,使用 children 属性来实现。
{
path: '/find',
component: Find,
// 嵌套视图
children: [
{ path: '', component: FindPanelA },
{ path: 't2', component: FindPanelB }
]
}
在应用程序中,状态就是数据。 状态管理工具在Vue项目架构中是可选的。但是,从项目发展角度看,最好还安装、集成一下。 Vuex,它是Vue全家桶中最流利使用的状态工具。
npm i vuex --save
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({});
import store from './store/index.js'
new Vue({
store
}).$mount('#app')
把外部数据定义在Vuex的state中,页面中就可以通过 $store.state来使用了。 封装api接口(参考utils/api.js) 在Vuex导入api方法,在actions中定义与后端交互的逻辑,把处理完成的数据通过mutations方法提交到state 在mutations中定义 更新state的方法。当state变化时,页面自动更新 那么actions在哪里被触发呢?在页面逻辑中触发它。
【温馨提示】:建议在组件使用 map* 系列方法来使用Vuex中的数据和函数 mapState 和 mapGetters 在写在 computed 中 mapActions 和 mapMutations 写在 methods 中
是一个HTTP工具,用于与后端进行数据交互。 特点: 1、基于Promise封装的库 2、在客户端、Node端都可以使用
在项目中怎么使用呢? 1、cnpm install axios -S 2、一定要封装请求拦截器和响应拦截器。参考 utils/axios.js 3、最好把所有api统一封装可以复用的方法。参考 utils/api.js
浏览器同源策略阻止了ajax,怎么解决? 在项目根目录里新建vue.config.js文件,代码如下:
module.exports = {
devServer: {
// 用代理的方式来解决浏览器同源策略对ajax的限制
proxy: {
'/soso': {
target: 'https://c.y.qq.com', // 目标远程服务器
ws: true,
changeOrigin: true // 允许改变“域”
}
}
}
}
//定义路由规则
{
id: 1002,
path: '/find',
component: Find,
text: '公司新闻',
exact: false,
// 嵌套路由
children: [
{ path: '', component: FindPanelA }, // /find/
{ path: 't2', component: FindPanelB } // /find/t2
],
}
//渲染
今日
昨日
// 向状态管理中添加一条任务
confirm() {
// 向Vuex提交添加任务的申请
// this.$store.commit('addTask', this.task)
this.addTask(this.task)
this.task = ''
},
mutations: {
addTask(state, payload) { // 负荷
console.log('addTask', state, payload)
state.list.push({task: payload, id: Date.now()})
},
}
// 删除一条任务
remove(item) {
// 向Vuex提交删除任务的申请
// this.$store.commit('delTask', item.id)
this.delTask(item.id)
}
mutations: {
delTask(state, payload) {
state.list = state.list.filter(ele=>ele.id!==payload)
}
},
getters: {
total(state) {
return state.list.length
}
},
export function fetchQqMusic(params) {
return fetch({
url: '/soso/fcgi-bin/client_search_cp',
method: 'GET',
params
})
}
export default {
fetchQqMusic,
}
//查询字符串转换成json对象
let params = {}
str.split('&').map(ele=>{
let arr = ele.split('=')
params[arr[0]] = arr[1]
})