1.2 通过给Push方法传递相应的成功、失败的回调函数,可以捕获到当前错误,可以解决。
1.3通过底部的代码,可以实现解决错误
this.$router.push(
{
name:"search",
params:{
keyword: this.keyword,
},
query:{
k:this.keyword.toLocaleUpperCase()
}
},()=>{}, ()=>{}
)
这种写法:治标不治本,将来在别的组件当中push|replace,编程式导航还是有类似错误。
1.4
this:当前组件实例(search)
this. r o u t e r 属性:当前的这个属性,属性值 V u e R o u t e r 类的一个实例,当在入口文件注册路由的时候,给组件实例添加 router属性:当前的这个属性,属性值VueRouter类的一个实例,当在入口文件注册路由的时候,给组件实例添加 router属性:当前的这个属性,属性值VueRouter类的一个实例,当在入口文件注册路由的时候,给组件实例添加router|$route属性
push:VueRouter类的一个实例
//配置路由的地方
import Vue from "vue"
import VueRouter from "vue-router"
// 使用插件
Vue.use(VueRouter)
//建个对象 配置 路由规则
import Home from '@/pages/Home'
import Search from '@/pages/Search'
import Login from '@/pages/Login'
import Register from '@/pages/Register'
// 先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
// 重写push|replace
// 第一个参数:告诉原来push方法,你往哪里跳转(传递哪些参数)
// 第二个参数:成功回调
// 第三个参数:失败回调
// call||apply区别
// 相同点:都可以调用函数一次,都可以篡改函数的上下文一次
// 不同点:call与apply传递参数:call传递参数用逗号隔开,apply方法执行,传递数组
VueRouter.prototype.push = function (location, resolve, reject) {
if (resolve && reject) {
originPush.call(this, location, resolve, reject);
} else {
originPush.call(this, location, () => { }, () => { });
}
}
VueRouter.prototype.replace = function (location, resolve, reject) {
if (resolve && reject) {
originReplace.call(this, location, resolve, reject);
} else {
originReplace.call(this, location, () => { }, () => { });
}
}
const routes = [
//放置路由规则
// 重定向,在项目跑起来的时候,访问/,立马让他定向到首页
{
path: "/",
redirect: "/home",
meta: { show: true }
},
{
path: "/home",
component: Home,
meta: { show: true }
},
{
// 进行占位
path: "/Search/:keyword?",
component: Search,
meta: { show: true },
name: "search",
// 4. 路由组件能不能传递props数据?
// 1)布尔值写法:params
// props:true,
// 2)对象写法:额外的给路由组件传递一些props
// props:{a:1,b:2}
// 函数写法:可以params参数、query参数,通过props传递给路由组件
props: ($route) => ({ keyword: $route.params.keyword, k: $route.query.k })
},
{
path: "/Login",
component: Login,
meta: { show: false }
},
{
path: "/Register",
component: Register,
meta: { show: false }
},
]
//启用路由规则 建立路由
const router = new VueRouter({
mode: "history",
routes
})
//导出
export default router;
Home模块组件拆分
– 先把静态页面完成
– 拆分静态组件
– 获取服务器的数据进行显示
– 动态业务
三级联动组件完成
— 由于三级联动,在Home、Search、Detail等页面都有使用,因此把三级联动注册为全局组件。
好处:只需要注册一次,就可以在项目任意地方使用’
4: 完成其余静态组件
HTML + CSS + 图片资源
5. postman 测试接口
– 刚刚经过postman工具测试,接口是没有问题的
– 如果服务器返回的数据code字段200,代表服务器返回数据成功
– 整个项目,接口前缀都有/api字样
6.2 在项目当中经常API文件夹【axios】
接口当中:路径都带有/api
baseURL:“/api”
6.3 有同学axios基础不好,可以参考git|NPM关于axios文档
7.1 跨越问题
什么是跨域: 协议、域名、端口号不同请求,称之为跨域
http://localhost:8082/home — 前端项目本地服务器
http://39.98.123.211 —后端服务器
解决方法: JSONP,CROS、代理
8: nprogress进度条的使用
start:进度条开始
done:进度条结束
进度条颜色可以修改的,当然需要修改人家的样式
9:vuex状态管理库
9.1: vuex是什么?
vuex是官方提供一个插件,状态管理库,集中式管理项目中组件共用的数据。
切记,并不是全部项目都需要vuex,如果项目很小,完全不需要Vuex,如果项目很大,组件很多,数据很多很费劲,vuex
state
mutations,
actions,
getter,
modulesx实现模块式开发
9.2 vuex基本使用
创建文件夹store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
// 需要使用插件一次
Vue.use(Vuex);
// state:仓库存储数据的地方
const state = {
count:1
};
// mutations:修改state的唯一手段
const mutations = {
ADD(state){
state.count++;
}
};
// actions:处理action,可以书写自己的业务逻辑,也可以处理异步
const actions = {
// 这里可以书写业务逻辑,但是不能修改state
add({commit}){
commit("ADD");
}
};
// getters:理解为计算属性,用于简化仓库数据,让组件获取仓库的数据更加方便
const getters ={};
// 对外暴露store类的一个实例
export default new Vuex.Store({
state,
mutations,
actions,
getters
})
main.js进行引入仓库
import Vue from 'vue'
import App from './App.vue'
// 引入路由
import router from '@/router'
Vue.config.productionTip = false
// 三级联动组件----全局组件
import TypeNav from '@/pages/Home/TypeNav';
// 第一个参数:全局组件的名字,第二个参数:哪一个组件
Vue.component(TypeNav.name,TypeNav)
// 测试
import { reqCategoryList } from '@/api';
reqCategoryList();
// 引入仓库
import store from '@/store'
new Vue({
render: h => h(App),
// 注册路由:底下的写法KV一致省略V【router小写】
// 注册路由信息:当这里书写router的时候,组件身上都拥有¥route,$router属性
router,
// 注册仓库:组件实例的身上会多了一个$store属性
store
}).$mount('#app')
home.vue 实现计数器
<template>
<div >
我是首页
<!-- 三级联动全局组件:三级联动已经注册为全局组件,因此不需要再引入 -->
<button @click="add">点击我加上1</button>
<span>仓库的数据{{ count }}</span>
<button>点击我减去1</button>
</div>
</template>
<script>
// 引入其余的组件
import ListContainer from "@/pages/Home/ListContainer";
import Recommend from '@/pages/Home/Recommend';
import Rank from '@/pages/Home/Rank';
import Like from '@/pages/Home/Like';
import Floor from '@/pages/Home/Floor';
import Brand from '@/pages/Home/Brand';
import {mapState} from 'vuex'
export default {
name: '',
components:{
ListContainer,
Recommend,
Rank,
Like,
Floor,
Brand
},
data() {
return {};
},
computed:{
...mapState(['count'])
},
methods:{
//派发action
add(){
this.$store.dispatch('add')
}
}
};
</script>
<style scoped ></style>
9.3 vue
如果项目过大,组件过多,接口也很多,数据也很多,可以让vuex实现模块式开发
模拟state存储数据
{
count:1
search:{a:1},
detail:{sss},
pay:{}
}
进行模块化开发
import Vue from 'vue'
import Vuex from 'vuex'
// 需要使用插件一次
Vue.use(Vuex);
// 引入小仓库
import home from './home';
import search from './search';
// 对外暴露store类的一个实例
export default new Vuex.Store({
modules:{
home,
search
}
})
10:完成TypeNav三级联动展示数据业务
[
{
id:1,
name:"电子书",
child:[
{
id;2,
name:"喜羊羊",
child;[]
}
]
}
]