VUE学习笔记(二)

VUE进阶

vue-router

1、安装

npm i vue-router

2、注册

 1 import VueRouter from 'vue-router';
 2 
 3 //1、注册
 4 Vue.use(VueRouter);
 5 //2、创建一个路由对象
 6 let router=new VueRouter({
 7   //所有的路由映射,没一个路由就是一个对象
 8   routes:[
 9     {
10       path:"/",
11       name:'Main',
12       component:Main
13     }
14 
15   ]
16 })

 

queryString

待完善

路由守卫

 

组件内路由守卫

在组件内部定义

 1 // 跟methods: {}等同级别书写,组件路由守卫是写在每个单独的vue文件里面的路由守卫
 2 beforeRouteEnter (to, from, next) {
 3     // 注意,在路由进入之前,组件实例还未渲染,所以无法获取this实例,只能通过vm来访问组件实例
 4     next(vm => {})
 5 }
 6 beforeRouteUpdate (to, from, next) {
 7     // 同一页面,刷新不同数据时调用,
 8 }
 9 beforeRouteLeave (to, from, next) {
10     // 离开当前路由页面时调用
11 }

 

每个守卫方法接收三个参数:

  • to: Route: 即将要进入的目标 路由对象

  • from: Route: 当前导航正要离开的路由

  • next: Function:回调函数

全局路由守卫

在全局的router文件中定义

1 router.beforeEach((to, from, next) => {
2     console.log(to) => // 到哪个页面去?
3     console.log(from) => // 从哪个页面来?
4     next() => // 一个回调函数
5 }
6 router.afterEach(to,from) = {}

 

路由过渡的进度

npm nprogress

路由动画

 1 <transition name="fade">
 2   <router-view/>
 3 </transition>
 4 ...
 5 </template>
 6 <style>
 7 .fade-enter-active {
 8   transition: opacity .5s;
 9 }
10 .fade-leave-active {
11   transition: none;
12 }
13 .fade-enter, .fade-leave-to {
14   opacity: 0;
15 }
16 </style>

 

打包

npm run build

会在项目根目录下生成一个dist的文件夹

嵌套路由

router

 1  {
 2       path:'/user',
 3       name :'User',
 4       component:User,
 5       children:[
 6         {
 7           path:'profile',
 8           name:'Profile',
 9           component:Profile
10         },
11         {
12           path:'cart',
13           name:'Cart',
14           component:Cart
15         }
16       ]
17     }

 

view

user.vue

 1 <template>
 2     <div>
 3         <h3>用户中心</h3>
 4         <ul class="left">
 5             <!-- 这是硬编码 -->
 6             <!-- <router-link tag="li" to="/user/profile">基本信息</router-link>
 7             <router-link tag="li" to="/user/cart">我的购物车</router-link> -->
 8             <!-- 可以改为下面这种非硬编码 -->
 9              <router-link tag="li" :to="{name:'Profile'}">基本信息</router-link>
10             <router-link tag="li" :to="{name:'Cart'}">我的购物车</router-link>
11         </ul>
12         <!-- <div class="right"> -->
13             <router-view></router-view>
14         <!-- </div> -->
15     </div>
16 </template>
17 
18 <script>
19 export default {
20     'name':'User'
21 }

cart.vue

1 <template>
2     <div>用户购物车列表</div>
3 </template>
4 
5 <script>
6 export default {
7     name:'Cart'
8 }
9 </script>

profile.vue

1 <template>
2     <div>用户信息列表</div>
3 </template>
4 
5 <script>
6 export default {
7     name:'Provile'
8 }
9 </script>

设置默认子路由

// 如果需要设置默认子路由,那么path就可以留空,同时父级的name不需要设置

 1 {
 2       path:'/user',
 3       // name :'User',
 4       component:User,
 5       children:[
 6         {
 7           path:'',
 8           // name:'Profile',
 9           name:'User',
10           component:Profile
11         },
12         {
13           path:'cart',
14           name:'Cart',
15           component:Cart
16         }
17       ]
18     }

限制CSS作用域

用过scoped

 1 <style scoped>
 2 .left {
 3     float: left;
 4     width: 200px;
 5 }
 6 .left li {
 7     line-height: 30px;
 8     cursor: pointer;
 9 }
10 </style>

重定向

一般有两种应用场景

  • 临时改了地址

  • 权限问题

案例

现有一小说网站,提供了 男生频道女生频道 的两个入口,用户首次进入页面的时候,会出现选择,并记住用户的选择,以后该用户进入网站直接根据记录的选择进入对应的频道

组件

1 // BookChoose.vue
2 <template>
3     <div>
4         <router-link :to="{name: 'book-boy'}">男生</router-link>
5         <span> | </span>
6         <router-link :to="{name: 'book-girl'}">女生</router-link>
7     </div>
8 </template>

 1 // BookBoy.vue
 2 <template>
 3     <div>
 4         BookBoy
 5     </div>
 6 </template>
 7 
 8 <script>
 9 export default {
10     name: 'BookBoy',
11     created() {
12         localStorage.setItem('book-type', 'book-boy');
13     }
14 }
15 </script>
 1 // BookGirl.vue
 2 <template>
 3     <div>
 4         BookGirl
 5     </div>
 6 </template>
 7 
 8 <script>
 9 export default {
10     name: 'BookGirl',
11     created() {
12         localStorage.setItem('book-type', 'book-girl');
13     }
14 }
15 </script>

路由配置

 1 {
 2   path: '/book',
 3   name: 'book',
 4   // redirect: { name: 'book-choose' }
 5   redirect: to => {
 6     let type = localStorage.getItem('book-type')
 7     return { name: type || 'book-choose' }
 8   }
 9 },
10 {
11   path: '/book-choose',
12   name: 'book-choose',
13   component: BookChoose
14 },
15 {
16   path: '/book-boy',
17   name: 'book-boy',
18   component: BookBoy
19 },
20 {
21   path: '/book-girl',
22   name: 'book-girl',
23   component: BookGirl
24 }

 

路由的滚动行为

前端路由并没有重载整个浏览器,只是通过 DOM 进行了局部更新。所以,有的时候,浏览器的一只状态会被保持,比如 滚动条,当我们在一个页面中滚动滚动条,然后跳转到另外一个页面,滚动条会保持在上一个页面中,我们其实更希望滚动条能回到页面顶部,就像重载了整个页面一样

 1 const router = new VueRouter({ 2 routes: [...], 3 scrollBehavior: () => ({ y: 0 }) 4 }); 

正对 后退/前进 行为,会提供一个 savedPosition 参数,通过该参数返回历史记录中的滚动值

1 scrollBehavior (to, from, savedPosition) {
2   // console.log(savedPosition)
3   if (savedPosition) {
4     return savedPosition
5   } else {
6     return { x: 0, y: 0 }
7   }
8 }

vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

这个状态自管理应用包含以下几个部分:

  • state,驱动应用的数据源;

  • view,以声明方式将 state 映射到视图;

  • actions,响应在 view 上的用户输入导致的状态变化。

 

state

天生具有命名空间

mutations

支持同步调用

actions

支持异步调用

mapState

可以传入数组,示例

1  computed: mapState(['user'])

将仓库中state中对应的'user' 赋值给计算属性的user

也可以传入对象,适用于有命名空间的

示例

1  //传入对象,适合有命名空间的
2     computed:mapState({
3         user:(state)=>{
4             console.log(state);
5             return state.userModule.user;
6         }
7     })

代码示例

/router/user.js

 1 export default{
 2     state:{
 3         name:'',
 4         user:null
 5     },
 6     mutations:{
 7         uploadUser(state,payload){
 8             // console.log("mutations:name",name);
 9             state.user=payload
10         }
11     },
12     actions:{
13         async login(store,payload){ 
14             // try {
15                 let rs= await api.login(payload);
16                 store.commit('uploadUser',rs.data);
17                 localStorage.setItem("user",JSON.stringify(rs.data));
18                 localStorage.setItem("token",rs.headers.authorization);
19             // } catch (e) {
20             //     throw e;
21             // }
22                
23         }
24     }
25 
26 }

/router/index.js

 1 import  Vue from 'vue';
 2 import Vuex from 'vuex';
 3 
 4 Vue.use(Vuex);
 5 
 6 import user from './user.js';
 7 const store =new Vuex.Store({
 8    modules: {
 9        userModule:user
10    }
11 
12 })
13 
14 export default store;

客户端调用

 1 await this.$store.dispatch('login', this.submitData); 

应用部署

1、打包

把项目运行过程中的资源进行整理(编译、解析......过程)

命令:npm run build

2、部署

把代码放到不同的环境下运行

  • 本地部署

  • 测试环境部署

  • 生产环境部署

无论何种环境,首先我们需要准备(搭建)一个用来提供web服务的WebServer

3、WebServer的搭建

  • nodejs来搭建

  • nginx

  • apache

  • iis

  • ......

 

 

posted @ 2020-10-16 12:24  生命树gyh  阅读(106)  评论(0编辑  收藏  举报
© 2020 GitHub, Inc.