尚硅谷Vue系列教程学习笔记(14)

Posted wyypersist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷Vue系列教程学习笔记(14)相关的知识,希望对你有一定的参考价值。

尚硅谷Vue系列教程学习笔记(14)

  • 参考课程:《尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通》
  • 参考链接:https://www.bilibili.com/video/BV1Zy4y1K7SH?vd_source=4f4d3466cdc2c5a2539504632c862ce7
  • 笔记上传说明:上述课程中共有168节小课,对每10次课的笔记整合之后上传一次。
  • 详细代码案例请移步本人gitee仓库: vue_basic案例代码实现
  • Vue-cli脚手架实现案例代码见仓库:vue01

目录

131-独享路由守卫

给每个组件添加路由守卫的案例代码:

//在store/index.js中的代码
//配置路径:key:value的对应关系
const routes = [
    
        path: '/about',
        name: "about",
        component: About,
        meta: 
            title: "关于"
        
    ,
    
        name: "home",
        path: '/home',
        component: Home,
        meta: 
            title: "主页"
        ,
        children: [
            
                name: "message",
                path: "message",
                component: Message,
                meta: //设置需要权限校验属性
                    isAuth: true,
                    title: "消息列表"
                ,
                //设置独享路由守卫,由一个组件独享
                beforeEnter: (to, from, next) => 
                    console.log("前置路由守卫被调用...", to, from)
                    //实现网页title随着组件切换改变,需要在上述的每个路由中添加路由元数据meta中进行添加

                    //增加判断逻辑
                    if (to.meta.isAuth) //判断是否需要权限校验
                        alert("对不起,您当前无权限!")
                     else 
                        next()
                    
                    //调用next函数,表示处理过上述逻辑之后,继续往下走
                    // next()
                ,
                children: [
                    
                        name: "detail",
                        path: "detail",
                        component: MessageDetail,
                        meta: 
                            isAuth: true,
                            title: "消息详情"
                        
                        //设置props属性接受传来的值,第一种一般的props写法
                        // props: 
                        //     id: 1,
                        //     title: '测试',
                        //     content: '内容'
                        // 

                        // //第二种props写法
                        // props: true//表示该路由组件接受到的params参数以props的形式传递给该组件,在该组件中使用props属性接受即可

                        // props($route) 
                        //     return 
                        //         id: $route.params.id,
                        //         title: $route.params.title,
                        //         content: $route.params.content
                        //     
                        // 
                    
                ]
            ,
            
                name: "news",
                path: "news",
                component: News,
                meta: //设置需要权限校验属性
                    isAuth: true,
                    title: "新闻列表"
                ,
                beforeEnter: (to, from, next) => 
                    console.log("前置路由守卫被调用...", to, from)
                    //实现网页title随着组件切换改变,需要在上述的每个路由中添加路由元数据meta中进行添加

                    //增加判断逻辑
                    if (to.meta.isAuth) //判断是否需要权限校验
                        alert("对不起,您当前无权限!")
                     else 
                        next()
                    
                    //调用next函数,表示处理过上述逻辑之后,继续往下走
                    // next()
                ,
            
        ]
    ,
]


重点:独享路由守卫只有前置没有后置。

132-组件内路由守卫

作用:如果该组件有独有的逻辑需要在进入或离开时进行处理,那么就可以使用组件内路由守卫。

案例实现代码:

<template>
  <h2>我是About的内容</h2>
</template>

<script>
export default 
  // eslint-disable-next-line vue/multi-word-component-names
  name: "About",
  //通过路由规则进入该组件时被调用
  beforeRouteEnter(to, from, next)
    console.log("About组件进入时调用...")
    next()
  ,

  //通过路由规则离开该组件时被调用
  beforeRouteLeave (to, from, next) 
    console.log("About组件离开时调用...")
    next()
  
;
</script>

<style>
</style>

133-history模式和hash模式

路由器的两种工作模式:history模式和hash模式。

重点:路径里面从#开始之后的所有值都算作为路由中的hash值,所有的hash值不会随着请求发送给服务器的。

两种模式下路径的区别:
使用hash模式之后,路径中会出现:/#/
使用history之后,路径中很干净只有:/

项目上线之前需要对编写的页面进行打包,之后才可以上线部署运行。

重点:Vue3项目中使用route/index.js中添加属性mode更改路由器默认工作模式的示例代码如下:


//创建路由器对象
const router = createRouter(
    //配置路由模式为hash模式
    history: createWebHashHistory(),
    //配置路由模式为history模式
    history: createWebHistory(),
    routes
)


重点:使用build指令对编写好的项目进行打包案例代码的步骤:
1.在命令行运行:npm run build即可,执行时间取决于项目大小(注意:Vue只看src文件夹下有什么,就打包什么,打包出来的文件需要在服务器上进行部署才可以展现);
2.然后在项目中出现了一个dist文件夹;
3.项目上线之前需要创建一个微型的服务器,创建服务器的步骤如下:
(1)在桌面创建一个demo文件夹,然后用vscode打开,然后在命令行写入:npm init,除了服务器名字自定义之外,其他的一路回车即可,完成项目初始化;
(2)然后,在命令行里面安装express,使用命令:npm i express;
(3)然后在demo项目中创建一个sever.js文件,其中写入代码为:
```
const express = require(‘express’)

const app = express()

//配置服务器响应get请求
app.get(‘/person’, (req, res) =>
//返回数据配置
res.send(
name: ‘wyy’,
age:22
)
)

app.listen(5005, (err) =>
if(!err) console.log(“服务器启动成功…”)
)

```

(4)然后在命令行直接运行node server启动服务器成功;

4.然后在demo项目中创建一个static文件夹,其中存放一些静态资源文件,这里来自于使用npm run build打包的使用Vue-cli打包之后的dist文件夹里面的文件。

5.然后在server.js文件中写入如下代码,目的是为让服务器识别static文件夹下面的静态资源:


const app = express()

//让服务器使用静态资源
app.use(express.static(__dirname+'/static'))


6.同时为了解决使用路由模式为history时出现的刷新页面请求时出现的404问题,还需要在server.js中引入如下代码:


const history = require('connect-history-api-fallback')


//注意需要在解析static之前使用
//在使用静态资源之前使用上述的connect-history-api-fallback
app.use(history())

7.完成项目的简单部署。

134-element-ui的基本使用

Vue中组件分为两大类:
1.移动端UI组件:Vant/Cube UI/Mint UI等;
2.PC端UI组件:element-UI/IView UI等;

注意:使用开源UI组件需要项目不那么定制化实现,如果项目定制化实现,那么不推荐使用开源的UI组件。

注意:一些典型的管理系统适合使用开源UI组件。

在项目中使用element-ui组件的案例代码,在App.vue组件中:


<template>
  <div>
    <!-- 日期选择器 -->
    <el-date-picker
      v-model="queryParams.begintime"
      type="daterange"
      unlink-panels
      :start-placeholder="starDate"
      :end-placeholder="endDate"
      :shortcuts="shortcuts"
      value-format="YYYY-MM-DD"
      :disabled-date="disabledDate"
      @calendar-change="handleChange"
      @focus="handleFocus"
    />
  </div>
</template>

<script>
import  ref, reactive  from "vue";
export default 
  name: "App",
  setup() 
    // 日期选择器默认开始时间-上周年月日
    let starDate = new Date();
    starDate.setTime(starDate.getTime() - 3600 * 1000 * 24 * 7);
    starDate = getNewTime(starDate);
    // 日期选择器默认结束时间-当前年月日
    let endDate = getNewTime(new Date());
    // 日期选择器快捷方式
    const shortcuts = [
      
        text: "上周",
        value: () => 
          const end = new Date();
          const start = new Date();
          start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
          return [start, end];
        ,
      ,
      
        text: "上月",
        value: () => 
          const end = new Date();
          const start = new Date();
          start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
          return [start, end];
        ,
      ,
      
        text: "过去三个月",
        value: () => 
          const end = new Date();
          const start = new Date();
          start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
          return [start, end];
        ,
      ,
    ];
    // 查询条件
    const queryParams = reactive(
      begintime: null,
    );
    // 当前选择的开始日期
    const pickDay = ref(null);
    // 获取当前年月日的函数
    function getNewTime(date) 
      let y = date.getFullYear(); //年
      let m = date.getMonth() + 1; //月,月是从0开始的所以+1
      let d = date.getDate(); //日
      m = m < 10 ? "0" + m : m; //小于10补0
      d = d < 10 ? "0" + d : d; //小于10补0
      return y + "-" + m + "-" + d; //返回时间形式yyyy-mm-dd
    
    // 时间选择器禁用范围
    const disabledDate = (time) => 
      if (!pickDay.value) 
        return false;
       else 
        const con1 =
          new Date(pickDay.value).getTime() - 1 * 24 * 60 * 60 * 1000;
        const con2 =
          new Date(pickDay.value).getTime() + 30 * 24 * 60 * 60 * 1000;
        return time < con1 || time > con2;
      
    ;
    // 日期选择器选择时触发
    function handleChange(val) 
      const [pointDay] = val;
      pickDay.value = pointDay;
    
    // 日期选择器获得焦点时触发
    function handleFocus() 
      pickDay.value = null;
    
    return 
      starDate,
      endDate,
      shortcuts,
      queryParams,
      disabledDate,
      handleChange,
      handleFocus,
    ;
  ,
;
</script>

注意:上述直接在main.js中引入所有的css文件和组件对前端项目是非常不友好的,因为会造成很多的代码冗余,且项目体积过大。

135-element-UI组件按需引入

Vue3中配置如下:
1.首先安装两个依赖:npm install -D unplugin-vue-components unplugin-auto-import;
2.然后,在项目的vue.config.js文件中写入如下代码:

const  defineConfig  = require('@vue/cli-service')

//按需引入element-ui组件
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const  ElementPlusResolver  = require('unplugin-vue-components/resolvers')

module.exports = defineConfig(
  transpileDependencies: true,
  
  // 和webpapck属性完全一致,最后会进行合并
  configureWebpack: 
    //配置webpack自动按需引入element-plus,
    plugins: [
      AutoImport(
        resolvers: [ElementPlusResolver()]
      ),
      Components(
        resolvers: [ElementPlusResolver()]
      )
    ],
  
)

3.在App.vue组件中使用案例代码如下:


//待定,查了很多资料,但是仍然没有找到合适的解决方案(使用js语言)
...

136-Vue3的基本使用

重点:webpack支持Tree Shaking,来消除js中多余的没有用的代码。

Vue3中更好的与ts进行结合;

新特性:
1.组合API;
2.新的内置组件;
3.其它改变(例如:新的生命周期钩子等);

137-创建Vue3-CLI脚手架项目

使用如下代码判断Vue版本是否在4.5.0及以上:

vue --version
//或使用
vue -V

138-使用vite创建工程

现在使用的创建前端项目的工具为webpack。

重点:vite是新一代的创建前端项目的工具。
vite的优点:
1.vite中可快速打包,且快速冷启动;
2.轻量快速的热重载;
3.真正地按需编译,不再等待整个应用编译完成;

使用vite创建Vue3应用的步骤:
1.运行:npm init vite-app vue3_test_vite;
2.运行:cd vue3_test_vite;
3.运行:npm install;
4.运行:npm run dev;
5.访问服务器:http://localhost:3000

139-分析Vue3的工程结构

Vue3-CLI创建工程的结构分析:
1.main.js中变化:引入的不再是Vue构造函数了,而是一个createApp工厂函数来创建vm对象,实现代码如下:

import  createApp  from 'vue'
import App from './App.vue'
createApp(App).mount('#app')


//上述代码中,使用createApp函数创建vue实例对象app,这里的app和vue2中的vm更轻(即:app中不像vm中包含很多的属性和方法)

2.Vue3中可以不在template中放入div等根标签;

140-Vue3开发者工具的安装(略)

//截止到2022.9.3日晚20:28

以上是关于尚硅谷Vue系列教程学习笔记(14)的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷Vue系列教程学习笔记(14)

尚硅谷Vue系列教程学习笔记

尚硅谷Vue系列教程学习笔记

尚硅谷Vue系列教程学习笔记

尚硅谷Vue系列教程学习笔记

尚硅谷Vue系列教程学习笔记