当前位置:   article > 正文

Vue2.0-学习笔记

Vue2.0-学习笔记

目录

vue简介

1.什么是vue

2.vue的特性

2.1数据驱动视图

2.2双向数据的绑定

2.3MVVM

2.4MVVM的工作原理

vue的基本使用

2.基本代码与MVVM的对应关系

vue的调试工具

1.安装vue-devtools调试工具

2.配置Chrome浏览器中的vue-devtools

vue的指令与过滤器

1.指令的概念

1.1内容渲染指令

 1.2属性绑定指令

1.3事件绑定

1.4事件修饰符

1.5键盘修饰符

 1.6双向绑定指令

1.7条件渲染指令

1.8列表渲染指令

2.过滤器

2. 1过滤器的注意点

2.2私有过滤器和全局过滤器

2.3过滤器传参

vue基础入门

1.什么是watch监听器

 监听器的格式

immediate选项

deep选项

监听对象单个属性的变化

2.什么是计算属性

1.什么是计算属性

3.axios

 axios的基础语法

axios的基本使用

axios的扩展

4.vue-cli

1.什么是单页面应用程序

2.什么是vue-cli

3.vue-cli的使用

4.vue项目的运行流程

 5.vue组件

1.什么是组件化开发

2.vue中的组件化开发

3.vue组件的三个组成部分

4.组件之间的父子关系

4.1使用组件的三个步骤

​编辑

4.2注册全局组件

5.组件的props

 5.1props是只读的

5.2props的default默认值

 5.3props的type值类型

5.4props的require

6.组件之间的样式冲突问题

6.1解决组件之间的样式冲突

6.2 /deep/样式穿透

6.组件的生命周期

1.生命周期&生命周期函数

2.组件的生命周期函数的分类

​编辑

7.组件之间的数据共享

1.组件之间的关系

2.父组件向子组件共享数据

 3.子组件向父组件共享数据

4.兄弟组件之间的数据共享

5.EventBus的使用步骤

8.ref

1.什么是ref引用

 2.使用ref引用DOM

3.使用ref引用组件

4.this.$nextTick的应用场景

9.动态组件

1.什么是动态组件

2.如何实现动态组件渲染

​编辑

3.使用keep-alive保持状态

4.keep-alive对应的生命周期函数

5.keep-alive的include属性

 10.插槽

1.什么是插槽

2.后备内容

3.具名插槽

4.作用域插槽

11.自定义指令

1.什么是自定义指令

2.自定义指令的分类

 3.私有自定义指令

4.update函数

5.函数简写

6.全局自定义指令

7.配置全局axios

12.路由

1.什么是路由

 2.SPA与前端路由

3.什么是前端路由

4.前端理由的工作方式

   ​编辑

13.vue-router的基本用法

 1.什么是vue-router

2.vue-router安装和配置的步骤

2.1在项目中安装vue-router

 2.2创建路由模块

2.3导入并挂载路由模块

2.4声明路由连接和占位符

14.vue-router的常见用法

1.路由重定向

2.嵌套路由

3.通过children属性声明子路由规则

4.默认子路由

5.动态路由匹配

6.声明式导航&编程式导航

 ​编辑

 6.1vue-roter中的编程式导航API

 6.2$router.push

6.3$router.repalce

6.4$router.go

6.5$router.go的简化用法

7.导航守卫

7.1全局前置守卫

 7.2守卫方法的3个形参

 7.3next函数的3种调用方式

 7.4控制后台主页的访问权限

扩展

1.封装utils目录下的request模块



vue简介

1.什么是vue

官方给出的概念:Vue(读音/vju/,类似于view)是一套用于构建用户界面的前端框架。

1.构建用户界面

  • 用vue往html页面中填充数据,非常的方便

2.框架

  • 框架是一套现场的解决方案,程序员只能遵守框架的规范,去编写自己的业务功能!
  • 要学习vue,就是在学习vue框架中的规定的用法!
  • vue的指令、组件(是对UI结构的复用)、路由、Vuex

2.vue的特性

vue框架的特性,主要体现在如下两方面:

1.数据驱动视图

2.双向数据绑定

2.1数据驱动视图

在使用vue的页面中,vue会监听数据的变化,从而自动重新渲染页面的结构。示意图如下:

 好处:当页面数据发生变化时,页面会自动重新渲染!

注意:数据驱动视图是单向的数据绑定

2.2双向数据的绑定

在网页中,form表单负责采集数据,Ajax负责提交数据

  • js数据的彼岸花,会被自动渲染到页面上
  • 页面上表单采集的数据发生变化的时候,会被vue自动获取到,并更新到js数据中

2.3MVVM

MVVM是vue实现数据驱动视图双向数据绑定的核心原理。MVVM指的是 Model、View和ViewModel,它把每个HTML页面都拆分成了这三个部分,如图所示:

2.4MVVM的工作原理

ViewModel作为MVVM的核心,是它把当前页面的数据源(Model)和页面的结构(View)连接在了一起。

 当数据源发生变化时,会被viewModel监听到,VM会根据最新的数据源自动更新页面的结构

表单元素的值发生变化时,也会被VM监听到,VM会把变化过后最新的值自动同步到Model数据源中

注意:数据驱动视图和双向数据绑定的底层原理是MVVM(Model数据源、View视图、ViewModel就是vue的实例)

vue的基本使用

2.基本代码与MVVM的对应关系

vue的调试工具

1.安装vue-devtools调试工具

vue官方提供的vue-devtools调试工具,能够方便开发者对vue项目进行调试与开发

Chrome浏览器在线安装vue-devtools:

https://chrome.google.com/webstore/detail/vuejs-devtools/nbdogjmejiglipccpnnnanhbledajbpd

2.配置Chrome浏览器中的vue-devtools

vue的指令与过滤器

1.指令的概念

指令(Directives)是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。

vue中的指令按照不同的用途可以分为如下6大类:

  1. 内容渲染指令
  2. 属性绑定指令
  3. 事件绑定指令
  4. 双向绑定指令
  5. 条件渲染指令
  6. 列表渲染指令

注意:指令是vue开发中的最基础、最常用、最简单的知识点

1.1内容渲染指令

内容渲染指令用来辅助开发者渲染DOM元素的文本内容。常用的内容渲染指令有如下3个:

  • v-text
  • {{}}
  • v-html

v-text

用法示例:

1.v-text指令的缺点:会覆盖元素内部原有的内容!

{{}}语法

vue提供的{{}}语法,专门用来解决v-text会覆盖默认文本内容的问题。这种{{}}语法的专业名称是插值表达式(英文名:Mustache

 {{}}表达式:在实际开发中用的最多,只是内容的占位符,不会覆盖原有的内容!

v-html

v-html指令的作用:可以把带有标签的字符串,渲染成真正的HTML内容!

 1.2属性绑定指令

注意:插值表达式只能用在元素的内容节点中,不能用在元素的属性节点中!

v-bind:

  1. <!--希望Vue能够控制下面的这个div,帮我们在把数据填充到div内部-->
  2. <div id="app">
  3. <input type="text" v-bind:placeholder="tips">
  4. <hr/>
  5. <!--vue规定v-bind:指令可以简写为:-->
  6. <img :src="photo" style="width: 150px;">
  7. </div>
  8. <!--1.导入Vue的库文件-->
  9. <script src="./lib/vue-2.6.12.js"></script>
  10. <!--2.创建Vue的实例对象-->
  11. <script>
  12. //创建Vue的实例对象
  13. const vm=new Vue({
  14. //el 属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接受的值是一个选择器
  15. el:'#app',
  16. //data对象就是要渲染到页面上的数据
  17. data:{
  18. tips:'请输入用户名',
  19. photo:'https://img-home.csdnimg.cn/images/20201124032511.png'
  20. }
  21. });
  22. </script>

在vue中,可以使用v-bind:指令,为元素的属性动态绑定值;

简写是:

使用Javascript表达式

在vue提供的模板渲染语法中,除了支持绑定简单的数据值之外,还支持javascript表达式的运算,例如:

1.3事件绑定

vue提供了v-on时间绑定指令,用来赋值程序员为DOM元素绑定事件监听。语法格式如下:

1.v-on:简写是@

2.语法格式为:

  1. <button @click="add"></button>
  2. methods:{
  3. add(){
  4. //如果在方法中要修改data中的数据,可以通过this访问到
  5. this.count+=1
  6. }
  7. }

 3.$event的应用场景:如果默认的事件对象e被覆盖了,则可以手动传递一个$event。例如:

  1. <button @click="add(1,$event)"></button>
  2. methods:{
  3. add(n,e){
  4. //如果在方法中要修改data中的数据,可以通过this访问到
  5. this.count+=1
  6. }
  7. }

1.4事件修饰符

 .prevent

<a @click.prevent="xxx">链接</a>

.stop

<button @click.stop="xxx"></button>

1.5键盘修饰符

 1.6双向绑定指令

 v-model指令

1.input

2.textarea

3.select

v-model指令的修饰符

1.7条件渲染指令

1.v-show的原理是:动态为元素添加或移除 display:none样式,来实现元素的显示和隐藏

  • 如果要频繁的切换元素的显示状态,用v-show会更好 

2.v-if的原理是:每次动态创建或移除元素,实现元素的显示和隐藏

  • 如果刚进入页面的时候,某些元素默认不需要被展示,而且后期这个元素很可能也不需要被展示出来,此时v-if性能更好

3.在实际开发中,绝大多数情况,不用考虑性能问题,直接使用v-if就好了

v-else

v-else-if

1.8列表渲染指令

  1. <!--希望Vue能够控制下面的这个div,帮我们在把数据填充到div内部-->
  2. <div id="app">
  3. <table class="table table-bordered table-hover table-striped">
  4. <thead>
  5. <th>索引</th>
  6. <th>Id</th>
  7. <th>姓名</th>
  8. </thead>
  9. <tbody>
  10. <!--官方建议:只要用到了v-for指令,那么一定要绑定一个:key属性-->
  11. <!--而且,尽量把id作为key的值-->
  12. <!--官方对key的值类型,室友要求的:字符串或数字类型-->
  13. <!--key的值千万不能重复的,否则会终端报错:Duplicate keys detected-->
  14. <tr v-for="(item,index) in list" :key="item.id" :title="item.name">
  15. <td>{{index}}</td>
  16. <td>{{item.id}}</td>
  17. <td>{{item.name}}</td>
  18. </tr>
  19. </tbody>
  20. </table>
  21. </div>
  22. <!--1.导入Vue的库文件-->
  23. <script src="./lib/vue-2.6.12.js"></script>
  24. <!--2.创建Vue的实例对象-->
  25. <script>
  26. //创建Vue的实例对象
  27. const vm = new Vue({
  28. //el 属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接受的值是一个选择器
  29. el: '#app',
  30. //data对象就是要渲染到页面上的数据
  31. data: {
  32. list: [
  33. { id: 1, name: '张三' },
  34. { id: 2, name: '李四' },
  35. { id: 3, name: '王五' }
  36. ]
  37. }
  38. });
  39. </script>

2.过滤器

2. 1过滤器的注意点

1.要定义到filters节点下,本质是一个函数

2.在过滤器函数中,一定要有return值

3.在过滤器的形参中,就可以获取到“管道符”前面待处理的那个值

4.如果全局过滤器和私有过滤器名字一致,此时安装“就近原则”,调用的是私有过滤器

2.2私有过滤器和全局过滤器

2.3过滤器传参

vue基础入门

1.什么是watch监听器

 监听器的格式

1.方法格式的侦听器

  • 缺点1:无法在刚进入页面的时候,自动触发
  • 缺点2:如果侦听的是一个对象,如果对象中的属性发生了变化,不会触发侦听器

2.对象格式的侦听器

  • 好处1:可以通过immediate选项,让侦听器自动触发
  • 好处2:可以通过deep选项,让侦听器深度侦听对象中每个属性的彼岸花

immediate选项

deep选项

监听对象单个属性的变化

2.什么是计算属性

1.什么是计算属性

特点:

  1. 定义的时候,要被定义为"方法"
  2. 在使用计算属性的时候,当普通的属性使用即可 

好处:

  1. 实现了代码的复用
  2. 只要计算属性中依赖的数据源变化了,则计算属性会自动重新求值

3.axios

axios是一个专注于网络请求的库

 

 axios的基础语法

axios的基本使用

  1. <script src="./lib/axios.js"></script>
  2. <script>
  3. //http://www.liulongbin.top:3006/api/getbooks
  4. //1.调用axios方法得到的返回值是Promise对象
  5. const result = axios({
  6. //请求方式
  7. method: 'GET',
  8. //请求的地址
  9. url: 'http://www.liulongbin.top:3006/api/getbooks',
  10. //URL中的查询参数
  11. params: {
  12. id: 1
  13. },
  14. //请求体参数
  15. data: {}
  16. }).then(function (result) {
  17. console.log(result);
  18. })
  19. </script>

axios的扩展

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <button id="btnPost">发起POST请求</button>
  11. <button id="btnGet">发起GET请求</button>
  12. <script src="./lib/axios.js"></script>
  13. <script>
  14. //http://www.liulongbin.top:3006/api/getbooks
  15. document.querySelector('#btnPost').addEventListener('click', async function () {
  16. //1.调用axios方法得到的返回值是Promise对象
  17. //如果调用某个方法的返回值是Promise实例,则前面可以添加await
  18. //await 只能用在背async"修饰"的方法中
  19. const { data: res } = await axios({
  20. //请求方式
  21. method: 'POST',
  22. //请求的地址
  23. url: 'http://www.liulongbin.top:3006/api/post',
  24. //请求体参数
  25. data: {
  26. name: 'zs',
  27. age: 20
  28. }
  29. })
  30. console.log(res);
  31. })
  32. document.querySelector("#btnGet").addEventListener('click', async function () {
  33. //结构赋值的时候,使用:进行重命名
  34. //1.调用axios之后,使用async/await进行简化
  35. //2.使用解构赋值,从axios封装的大对象中,把data属性解构出来
  36. //3.把解构出来的data属性,使用冒号 进行命名,一般都重命名为{data : res}
  37. //1.调用axios方法得到的返回值是Promise对象
  38. const { data: res } = await axios({
  39. //请求方式
  40. method: 'GET',
  41. //请求的地址
  42. url: 'http://www.liulongbin.top:3006/api/getbooks',
  43. //URL中的查询参数
  44. params: {
  45. // id: 825
  46. }
  47. })
  48. console.log(res);
  49. })
  50. </script>
  51. </body>
  52. </html>

4.vue-cli

1.什么是单页面应用程序

2.什么是vue-cli

3.vue-cli的使用

1.在终端下运行如下的命令,创建指定名称的项目:

vue create 项目名称

2.vue项目中src目录的构成:

assets 文件夹:存放项目钟用到的静态资源文件,例如:css样式表 图片资源

components 文件夹:程序员封装的 可复用的组件,都要放到components目录下

main.js 是项目的入口文件,整个项目的运行,要先执行main.js

App.vue 是项目的根组件

4.vue项目的运行流程

 5.vue组件

1.什么是组件化开发

2.vue中的组件化开发

3.vue组件的三个组成部分

  1. <template>
  2. <div class=".test-box">
  3. <h3>这是用户自定义的 Test.vue --- {{username}}</h3>
  4. </div>
  5. </template>
  6. <script>
  7. //默认导出,这是固定写法
  8. export default {
  9. //默认导出 这是固定写法
  10. //data 数据源
  11. //注意 .vue组件中的data不能像之前一样,不能指向对象
  12. //注意:组件中的data必须是一个函数
  13. data(){
  14. //这个return出去的{ }中,可以定义数据
  15. return {
  16. username:'admin'
  17. }
  18. }
  19. }
  20. </script>
  21. <style>
  22. .test-box{
  23. background-color: pink;
  24. }
  25. </style>

4.组件之间的父子关系

4.1使用组件的三个步骤

4.2注册全局组件

5.组件的props

 5.1props是只读的

5.2props的default默认值

 5.3props的type值类型

5.4props的require

6.组件之间的样式冲突问题

6.1解决组件之间的样式冲突

<style lang="less" scoped> 

6.2 /deep/样式穿透

  1. // 当使用第三方组件库的时候,如果有修改第三方组件默认样式的需求,需要用到 /deep/
  2. /deep/ h5 {
  3. color: pink;
  4. }

6.组件的生命周期

1.生命周期&生命周期函数

2.组件的生命周期函数的分类

7.组件之间的数据共享

1.组件之间的关系

2.父组件向子组件共享数据

 3.子组件向父组件共享数据

4.兄弟组件之间的数据共享

5.EventBus的使用步骤

8.ref

1.什么是ref引用

 2.使用ref引用DOM

  1. <template>
  2. <div class="app-container">
  3. <h1 ref="myh1">App 根组件</h1>
  4. <button @click="showThis">更新h1</button>
  5. <hr />
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. methods: {
  11. showThis() {
  12. //当前App组件的实例对象
  13. this.$refs.myh1.style.color = 'red'
  14. console.log(this);
  15. }
  16. }
  17. }
  18. </script>

3.使用ref引用组件

app.vue如下:

  1. <template>
  2. <div class="app-container">
  3. <button @click="onReset">重复Left组件的count值为0</button>
  4. <hr />
  5. <input type="text" v-if="inputVisible" @blur="showButton" ref="iptRef"/>
  6. <button v-else @click="showInput">展示输入框</button>
  7. <hr/>
  8. <div class="box">
  9. <!-- 渲染 Left 组件和 Right 组件 -->
  10. <!-- 3. 以标签形式,使用注册好的组件 -->
  11. <Left ref="comLeft"></Left>
  12. </div>
  13. </div>
  14. </template>
  15. <script>
  16. //1.导入需要使用的.vue组件
  17. import Left from '@/components/Left.vue'
  18. export default {
  19. //2.注册组件
  20. components: {
  21. Left
  22. }, methods: {
  23. onReset() {
  24. this.$refs.comLeft.resetCount()
  25. }
  26. }
  27. }
  28. </script>

Left.vue如下:

  1. <template>
  2. <div class="left-container">
  3. <h3>Left 组件 --- {{count}}</h3>
  4. <button @click="count+=1">+1</button>
  5. <button @click="resetCount">重置</button>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. count:0
  13. }
  14. }, methods: {
  15. resetCount() {
  16. this.count=0
  17. }
  18. }
  19. }
  20. </script>
  21. <style lang="less" scoped>
  22. .left-container {
  23. padding: 0 20px 20px;
  24. background-color: orange;
  25. min-height: 250px;
  26. flex: 1;
  27. }
  28. h3 {
  29. color: red;
  30. }
  31. // h5[data-v-3c83f0b7]
  32. // [data-v-3c83f0b7] h5
  33. // 当使用第三方组件库的时候,如果有修改第三方组件默认样式的需求,需要用到 /deep/
  34. /deep/ h5 {
  35. color: pink;
  36. }
  37. </style>

4.this.$nextTick的应用场景

  1. <template>
  2. <div class="app-container">
  3. <input type="text" v-if="inputVisible" @blur="showButton" ref="iptRef"/>
  4. <button v-else @click="showInput">展示输入框</button>
  5. <hr/>
  6. </div>
  7. </template>
  8. <script>
  9. //1.导入需要使用的.vue组件
  10. import Left from '@/components/Left.vue'
  11. export default {
  12. //2.注册组件
  13. components: {
  14. Left
  15. }, methods: {
  16. //点击按钮,展示输入框
  17. showInput() {
  18. //1.切换布尔值,把文本框展示出来
  19. this.inputVisible = true
  20. //2.让展示出来的文本框,自动获取焦点
  21. this.$nextTick(() => {
  22. this.$refs.iptRef.focus()
  23. })
  24. },
  25. //输入框失去焦点,显示按钮
  26. showButton() {
  27. this.inputVisible=false
  28. }
  29. },
  30. data() {
  31. return {
  32. //控制输入框和按钮的按需切换
  33. inputVisible: false
  34. }
  35. }
  36. }
  37. </script>

9.动态组件

1.什么是动态组件

2.如何实现动态组件渲染

3.使用keep-alive保持状态

4.keep-alive对应的生命周期函数

5.keep-alive的include属性

 10.插槽

1.什么是插槽

  1. <template>
  2. <div class="app-container">
  3. <h1>App 根组件</h1>
  4. <hr/>
  5. <div class="box">
  6. <Left>
  7. <!--默认情况下,在使用组件的时候,提供的内容都会被填充到名称为default的插槽之中-->
  8. <!--1.如果要把内容填充到指定名称的插槽中,需要使用v-slot:这个指令-->
  9. <!--2.v-slot:后面要跟上插槽的名称-->
  10. <!--3.v-slot:指令不能直接使用在元素身上,必须用在template标签上-->
  11. <!--4.template这个标签,它是一个虚拟的标签,只起到包裹性质的作用,但是,不会被渲染为任何实质性的html元素-->
  12. <!--5.v-slot:指令的简写形式是#-->
  13. <template #defalut><p>这是在Left组件的内容区域,声明的p标签</p></template>
  14. </Left>
  15. </div>
  16. </div>
  17. </template>
  18. <script>
  19. import Left from '@/components/Left.vue'
  20. import Right from '@/components/Right.vue'
  21. export default {
  22. data() {
  23. return {
  24. //comName 表示要展示的组件的名字
  25. comName:'Left'
  26. }
  27. },
  28. components: {
  29. //如果在"声明组件"的时候,没有为组件指定name名称,则组件的名称默认就是"注册时候的名称"
  30. Left,
  31. Right
  32. }
  33. }
  34. </script>
  35. <style lang="less">
  36. .app-container {
  37. padding: 1px 20px 20px;
  38. background-color: #efefef;
  39. }
  40. .box {
  41. display: flex;
  42. }
  43. </style>
  1. <template>
  2. <div class="left-container">
  3. <h3>Left 组件</h3>
  4. <hr />
  5. <!--声明一个插槽区域-->
  6. <!--vue官方规定:每一个slot插槽,都要有一个name名称-->
  7. <!--如果省略了slot的name属性,择优一个默认名称叫做default-->
  8. <slot name="default"></slot>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. name:'MyLeft'
  14. }
  15. </script>
  16. <style lang="less" scoped>
  17. .left-container {
  18. padding: 0 20px 20px;
  19. background-color: orange;
  20. min-height: 250px;
  21. flex: 1;
  22. }
  23. h3 {
  24. color: red;
  25. }
  26. // h5[data-v-3c83f0b7]
  27. // [data-v-3c83f0b7] h5
  28. // 当使用第三方组件库的时候,如果有修改第三方组件默认样式的需求,需要用到 /deep/
  29. /deep/ h5 {
  30. color: pink;
  31. }
  32. </style>

2.后备内容

 

3.具名插槽

  1. <template>
  2. <div class="article-container">
  3. <!--渲染文章的标题-->
  4. <div class="header-box">
  5. <slot name="title"></slot>
  6. </div>
  7. <!--文章的内容-->
  8. <div class="content-box">
  9. <slot name="content"></slot>
  10. </div>
  11. <!--文章的作者-->
  12. <div class="footer-box">
  13. <slot name="author"></slot>
  14. </div>
  15. </div>
  16. </template>

4.作用域插槽

  1. <template>
  2. <div class="app-container">
  3. <h1>App 根组件</h1>
  4. <hr/>
  5. <Article>
  6. <template #title>
  7. <h3>一首诗</h3>
  8. </template>
  9. <template #content="scope">
  10. <p>啊,大海,全是水.</p>
  11. <p>啊,蜈蚣,全是腿</p>
  12. <p>啊,辣椒,净辣嘴</p>
  13. <p>{{ scope }}</p>
  14. </template>
  15. <template #author>
  16. <div>作者:彬果锅</div>
  17. </template>
  18. </Article>
  19. </template>
  1. <template>
  2. <div class="article-container">
  3. <!--文章的内容-->
  4. <div class="content-box">
  5. <!--在封装组件时,为预留的<slot>提供属性对应的值,这种用法,叫做"作用域插槽"-->
  6. <slot name="content" msg="hello.vue.js" :user="userInfo"></slot>
  7. </div>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. //首字母要大写
  13. name: 'Article',
  14. data() {
  15. return {
  16. userInfo: {
  17. name: 'zs',
  18. age:20
  19. }
  20. }
  21. }
  22. }
  23. </script>

11.自定义指令

1.什么是自定义指令

2.自定义指令的分类

 3.私有自定义指令

  1. <template>
  2. <div class="app-container">
  3. <h1 v-color="color">App 根组件</h1>
  4. <p v-color="'red'">测试</p>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. color:'blue'
  11. }
  12. },
  13. directives: {
  14. //定义名为color的指令,指向一个配置对象
  15. color: {
  16. //当指令第一次被绑定到元素上的时候,会立即触发bind函数
  17. //形参中的el表示当前指令锁绑定到的那个DOM对象
  18. bind(el,binding) {
  19. console.log("触发了v-color的bind函数");
  20. el.style.color = binding.value
  21. console.log(binding);
  22. }
  23. }
  24. }
  25. }
  26. </script>

4.update函数

5.函数简写

6.全局自定义指令

7.配置全局axios

main.js中配置

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. import axios from 'axios'
  4. Vue.config.productionTip = false
  5. // 全局配置axios的请求根路径
  6. axios.defaults.baseURL = '请求根路径'
  7. // 把axios 挂载到 Vue.prototype上,供每个 .vue组件的实例直接使用
  8. Vue.prototype.$http = axios
  9. // 今后,在每个 .vue组件中药发起请求,直接调用 this.$http.xxx
  10. new Vue({
  11. render: (h) => h(App)
  12. }).$mount('#app')

12.路由

1.什么是路由

 2.SPA与前端路由

3.什么是前端路由

4.前端理由的工作方式

   

  1. <template>
  2. <div class="app-container">
  3. <h1>App 根组件</h1>
  4. <a href="#/home">首页</a>
  5. <a href="#/movie">电影</a>
  6. <a href="#/about">关于</a>
  7. <hr />
  8. <component :is="comName"></component>
  9. </div>
  10. </template>
  11. <script>
  12. // 导入组件
  13. import Home from '@/components/Home.vue'
  14. import Movie from '@/components/Movie.vue'
  15. import About from '@/components/About.vue'
  16. export default {
  17. name: 'App',
  18. data() {
  19. return {
  20. // 在动态组件的位置,要展示的组件的名字,值必须是字符串
  21. comName: 'Home'
  22. }
  23. },
  24. created() {
  25. // 只要当前的App组件一被创建,就立即监听window对象的onhashchange事件
  26. window.onhashchange = () => {
  27. console.log('监听到了 hash 地址的变化', location.hash)
  28. switch (location.hash) {
  29. case '#/home':
  30. this.comName = 'Home'
  31. break
  32. case '#/movie':
  33. this.comName = 'Movie'
  34. break
  35. case '#/about':
  36. this.comName = 'About'
  37. break
  38. }
  39. }
  40. },
  41. // 注册组件
  42. components: {
  43. Home,
  44. Movie,
  45. About
  46. }
  47. }
  48. </script>
  49. <style lang="less" scoped>
  50. .app-container {
  51. background-color: #efefef;
  52. overflow: hidden;
  53. margin: 10px;
  54. padding: 15px;
  55. > a {
  56. margin-right: 10px;
  57. }
  58. }
  59. </style>

13.vue-router的基本用法

 1.什么是vue-router

2.vue-router安装和配置的步骤

2.1在项目中安装vue-router

 2.2创建路由模块

  1. // src/router/index.js 就是当前项目的路由模块
  2. import Vue from 'vue'
  3. import VueRouter from 'vue-router'
  4. //导入需要的组件
  5. import Home from '@/components/Home.vue'
  6. import Movie from '@/components/Movie.vue'
  7. import About from '@/components/About.vue'
  8. Vue.use(VueRouter)
  9. // 创建路由的实例对象
  10. const router = new VueRouter({
  11. //路由规则
  12. routes: [
  13. { path: '/home', component: Home },
  14. { path: '/movie', component: Movie },
  15. { path: '/about', component: About}
  16. ]
  17. })
  18. export default router

2.3导入并挂载路由模块

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. // 导入路由模块,目的:拿到路由的实例对象
  4. // 在进行模块化导入的时候,如果给定的是文件夹,则默认导入这个文件夹下,名字叫做 index.js 的文件
  5. import router from '@/router/index.js'
  6. // 导入 bootstrap 样式
  7. import 'bootstrap/dist/css/bootstrap.min.css'
  8. // 全局样式
  9. import '@/assets/global.css'
  10. Vue.config.productionTip = false
  11. new Vue({
  12. render: h => h(App),
  13. // 在Vue项目中,要想把路由用起来,必须把路由实例对象,通过下面的方式进行挂载
  14. // router: 路由的实例对象
  15. router: router
  16. }).$mount('#app')

2.4声明路由连接和占位符

  1. <template>
  2. <div class="app-container">
  3. <h1>App2 组件</h1>
  4. <!--当安装和配置了vue-router后,就可以使用router-link来替代普通的a链接了-->
  5. <!-- <a href="#/home">首页</a> -->
  6. <router-link to="/home">首页</router-link>
  7. <router-link to="/movie">电影</router-link>
  8. <router-link to="/about">关于</router-link>
  9. <hr />
  10. <!--只要在项目中安装和配置了 vue-router,就可以使用router-view这个组件了-->
  11. <!--它的作用很单纯:占位符-->
  12. <router-view></router-view>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. name: 'App'
  18. }
  19. </script>
  20. <style lang="less" scoped>
  21. .app-container {
  22. background-color: #efefef;
  23. overflow: hidden;
  24. margin: 10px;
  25. padding: 15px;
  26. > a {
  27. margin-right: 10px;
  28. }
  29. }
  30. </style>

14.vue-router的常见用法

1.路由重定向

  1. Vue.use(VueRouter)
  2. // 创建路由的实例对象
  3. const router = new VueRouter({
  4. //路由规则
  5. routes: [
  6. //当用户访问/的时候,通过redirect属性跳转到/home对应的路由规则
  7. { path: '/',redirect: '/home'},
  8. { path: '/home', component: Home },
  9. { path: '/movie', component: Movie },
  10. { path: '/about', component: About}
  11. ]
  12. })

2.嵌套路由

3.通过children属性声明子路由规则

  1. <template>
  2. <div class="about-container">
  3. <h3>About 组件</h3>
  4. <!--子集路由链接-->
  5. <router-link to="/about/tab1">tab1</router-link>
  6. <router-link to="/about/tab2">tab2</router-link>
  7. <hr />
  8. <!--子集路由占位符-->
  9. <router-view></router-view>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'About'
  15. }
  16. </script>
  17. <style lang="less" scoped>
  18. .about-container {
  19. min-height: 200px;
  20. background-color: skyblue;
  21. padding: 15px;
  22. > a {
  23. margin-right: 10px;
  24. }
  25. }
  26. </style>
  1. // src/router/index.js 就是当前项目的路由模块
  2. import Vue from 'vue'
  3. import VueRouter from 'vue-router'
  4. //导入需要的组件
  5. import Home from '@/components/Home.vue'
  6. import Movie from '@/components/Movie.vue'
  7. import About from '@/components/About.vue'
  8. import Tab1 from '@/components/tabs/Tab1.vue'
  9. import Tab2 from '@/components/tabs/Tab2.vue'
  10. Vue.use(VueRouter)
  11. // 创建路由的实例对象
  12. const router = new VueRouter({
  13. //路由规则
  14. routes: [
  15. //当用户访问/的时候,通过redirect属性跳转到/home对应的路由规则
  16. { path: '/',redirect: '/home'},
  17. { path: '/home', component: Home },
  18. { path: '/movie', component: Movie },
  19. {
  20. path: '/about', component: About, children: [
  21. //子路由规则
  22. { path: 'tab1', component: Tab1 },
  23. { path: 'tab2', component: Tab2 }
  24. ]
  25. }
  26. ]
  27. })
  28. export default router

4.默认子路由

使用redirect设置当前默认显示的子路由,不加默认不显示

  1. // 创建路由的实例对象
  2. const router = new VueRouter({
  3. //路由规则
  4. routes: [
  5. {
  6. path: '/about',
  7. component: About,
  8. //默认子路由
  9. redirect: '/about/tab1',
  10. children: [
  11. //子路由规则
  12. { path: 'tab1', component: Tab1 },
  13. { path: 'tab2', component: Tab2 }
  14. ]
  15. }
  16. ]
  17. })

5.动态路由匹配

6.声明式导航&编程式导航

 

 6.1vue-roter中的编程式导航API

 6.2$router.push

this.$router.push('/movie/1')

6.3$router.repalce

this.$router.replace('/movie/1')

6.4$router.go

// go(-1) 表示后退一层

// 如果后退的层数超过上限,则原地不动

 this.$router.go(-1)

6.5$router.go的简化用法

 <!--在行内使用编程式导航跳转的时候,this必须要省略,否则会报错-->

    <button @click="$router.back()">back 后退</button>

    <button @click="$router.forward()">forward 前进</button>

7.导航守卫

7.1全局前置守卫

 7.2守卫方法的3个形参

 7.3next函数的3种调用方式

 7.4控制后台主页的访问权限

扩展

1.封装utils目录下的request模块

用于给不同的api调用不同的地址

 在src新建utils文件夹并创建request.js

  1. import axios from 'axios'
  2. const request = axios.create({
  3. // 指定请求的根路径
  4. baseURL: 'https://www.escook.cn'
  5. })
  6. export default request

假设有多个地址,可以创建多个mini axios 调用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/269273
推荐阅读
相关标签
  

闽ICP备14008679号