• 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      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

    • ......

     

  • 相关阅读:
    atan与atan2的区别
    UVALive 6324 Archery (求射箭覆盖的期望)
    哈希UVALive 6326 Contest Hall Preparation
    HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
    UVA:11183:Teen Girl Squad (有向图的最小生成树)
    POJ3164:Command Network(有向图的最小生成树)
    UVA10462:Is There A Second Way Left? (判断次小生成树)
    UVA10600:ACM Contest and Blackout(次小生成树)
    HDU4081:Qin Shi Huang's National Road System (任意两点间的最小瓶颈路)
    HDU1233:还是畅通工程(最小生成树)
  • 原文地址:https://www.cnblogs.com/LifeFruit/p/13825802.html
Copyright © 2020-2023  润新知