banner
banner
banner
NEWS LETTER

VUE2-进阶(主了解)

Scroll down

文件结构

├── node_modules 
├── public
│   ├── favicon.ico: 页签图标
│   └── index.html: 主页面
├── src
│   ├── assets: 存放静态资源
│   │   └── logo.png
│   │── component: 存放组件
│   │   └── HelloWorld.vue
│   │── App.vue: 汇总所有组件
│   │── main.js: 入口文件
├── .gitignore: git版本管制忽略的配置
├── babel.config.js: babel的配置文件
├── package.json: 应用包配置文件 
├── README.md: 应用描述文件
├── package-lock.json:包版本控制文件

关于不同版本的Vue:

  • vue.js与vue.runtime.xxx.js的区别:
    • vue.js是完整版的Vue,包含:核心功能+模板解析器
    • vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器
  • 因为vue.runtime.xxx.js没有模板解析器,所以不能使用template配置项,需要使用render函数接收到的createElement函数去指定具体内容

vue.config.js配置文件

  • 使用vue inspect > output.js可以查看到Vue脚手架的默认配置
  • 使用vue.config.js可以对脚手架进行个性化定制,详情见:Vue CLI

ref属性

  • 作用:给元素或子组件注册引用信息
  • 标签上使用ref="str"
  • 在函数中通过this.$refs.str来获取真实DOM元素
  • 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)

props配置

  • 父组件使用子组件的标签,并通过子组件的标签传递属性
    • 示例:<School name="moli">
  • 子组件通过props声明接收,三种方式:
    • 简单接收:props:['name']
    • 接收并对数据进行类型限制:props:{sex:String,name:String}
    • 接收并对数据进行类型限制+默认值的指定+必要性的限制
      1
      2
      3
      4
      5
      6
      7
      props:{
      name:{
      type:String, // 类型是字符串
      requigreen:true, // 必填的
      default:'a' // 默认值
      },
      }
  • 注:props是只读的,Vue底层会监测props的修改,如果改动,就会发出警告,若需要修改,则将props的内容添加到data,并给标签上的变量前面添加v-bind

mixin(混入)

  • 功能:可以把多个组件共用的配置提取成一个混入对象
  • 单独创建一个js文件,然后把共用的变量和方法写好,并暴露出来
    • 示例:export const huhe = {data(){},methods:{},…}
  • 在需要使用的组件中引入import
    • 全局混入:Vue.mixin(xxx)
    • 局部混入:在组件中添加mixins:[xxx]配置

插件

  • 本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据
  • 定义插件:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    对象.install = function (Vue, options) {
    // 1. 添加全局过滤器
    Vue.filter(....)
    // 2. 添加全局指令
    Vue.directive('指令名'{
    //指令与元素成功绑定时(一上来)
    bind(element,binding){
    element.value = binding.value
    },
    //指令所在元素被插入页面时
    inserted(element,binding){
    element.focus()
    },
    //指令所在的模板被重新解析时
    update(element,binding){
    element.value = binding.value
    }
    }
    // 3. 配置全局混入(合)
    Vue.mixin(....)
    // 4. 添加实例方法
    Vue.prototype.$myMethod = function () {...}
    Vue.prototype.$myProperty = xxxx
    }
  • 使用插件:在main.js中引入,并Vue.use(插件名,参数可选)

style标签的scoped属性

  • 作用:样式只作用于当前页面

组件化案例

  • 组件化编码流程:
    1. 拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突
    2. 实现动态组件:考虑好数据的存放位置
      ​- 数据是一个组件在用:放在组件自身
      • 数据是一些组件在用:放在他们共同的父组件上(状态提升
    3. 实现交互:从绑定事件开始
  • props适用于:父子组件通信
  • 使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!
  • props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐

webStorage

组件的自定义事件

  • 组件间通信的方式之一,适用于:子组件 ===> 父组件
  • 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中
  • 绑定自定义事件:
    1. 第一种方式,在父组件中:<Demo @事件名="自定义事件名"/>
    2. 第二种方式,在父组件中给组件:
      1
      2
      3
      4
      <Demo ref="实例名"/>
      mounted(){
      this.$refs.实例名.$on('事件名',this.test)
      }
  • 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法
  • 自定义事件名:父组件通过该事件的参数获取子组件传递过来的数据,名字随意
  • 子组件触发自定义事件:this.$emit('事件名',数据)
  • 子组件解绑自定义事件this.$off('事件名')
  • 组件上也可以绑定原生DOM事件,需要使用native修饰符
  • 注意:通过this.$refs.实例名.$on('事件名',获取事件的回调),回调要事先在methods中定义,或用箭头函数

全局事件总线(GlobalEventBus)

  • 组件间通信的方式之一,适用于任意组件间通信
  • 安装全局事件总线:在main.js的new Vue中添加
    1
    2
    3
    beforeCreate() {
    Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
    },
  • 使用事件总线:
    1. 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身
      • 在mounted中使用this.$bus.$on('自定义事件名',事件的回调函数)
      • 然后在befogreenestroy钩子中解绑事件,this.$bus.$off('自定义事件名')
    2. 提供数据:this.$bus.$emit('自定义事件名',数据)

消息订阅与发布(pubsub)

  • 组件间通信的方式之一,适用于任意组件间通信
  • 使用:
    1. 安装pubsub:npm i pubsub-js
    2. 引入: import pubsub from 'pubsub-js'
    3. 接收数据:A组件接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身
      • 在mounted钩子中添加this.pid = pubsub.subscribe('自定义事件名',回调事件) //订阅消息
    4. 提供数据:pubsub.publish('自定义事件名',数据)
    5. 最好在befogreenestroy钩子中,用PubSub.unsubscribe(pid)取消订阅

nextTick

  • 语法:this.$nextTick(回调函数)
  • 作用:在下一次 DOM 更新结束后执行其指定的回调
  • 什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行
  • 不用定时器的原因:使用nextTick时,也可以用setInterval,但是setInterval会无限循环

Vue封装的过度与动画

  • 作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名。
  • 写法一:
    • 使用<transition>包裹要过度的元素,并配置name属性
    • 如果给<transition>添加appear属性代表一出场就要有动画
    • 在style标签中写好动画样式,按一下规则命名:
      • 元素进入的样式:
        1. name-enter:进入的起点
        2. name-enter-active:进入过程中
        3. name-enter-to:进入的终点
      • 元素离开的样式:
        1. name-leave:离开的起点
        2. name-leave-active:离开过程中
        3. name-leave-to:离开的终点
    • 若有多个元素需要过度,则需要使用:<transition-group>替换 <transition>,且每个元素都要指定key值
  • 写法二:也可以使用外部样式表+标签来展示
    • 页面标签同上
    • 引入外部样式表
    • 将样式赋给标签上对应的样式(与上面的命名规则类似,不要前面的name-,在后面加-class)
      1
      2
      3
      4
      5
      6
      <transition-group 
      appear
      name="animate__animated animate__bounce"
      enter-active-class="animate__swing"
      leave-active-class="animate__backOutUp"
      >...</transition-group>
  • 常见的动画样式:animation+@keyframes,transition,transform

解决跨域的方式

  • 页面使用axios来请求接口时,会存在浏览器跨域的问题。这是因为同源策略。
  • 同源策略/SOP(Same origin policy):一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了,浏览器很容易受到XSS、CSFR等攻击。
  • 所谓同源 –> 指的是 “协议+域名+端口” 三者的相同 只要有一个不同就会导致跨域问题
  • 解决方案
    1. cors 主后端
    2. jsonp 前后端配合
    3. 代理服务器
      • nginx
      • vue

配置代理

  • 前情提要
    • 本地的端口一般默认时8080,所以配置proxy写的是另一个服务器的端口号
    • 都是在vue.config.js文件中添加配置

开启代理服务器方法一:直接配置proxy

1
2
3
devServer:{
proxy:"http://localhost:5000"
}
  • 优劣:
    1. 优点:配置简单,请求资源时直接发给前端(8080)即可。
    2. 缺点:不能配置多个代理,不能灵活的控制请求是否走代理。
    3. 工作方式:若按照上述配置代理,当请求了前端不存在的资源时,那么该请求会转发给服务器(优先匹配前端资源)

开启代理服务器方法二:配置具体代理规则

1
2
3
4
5
6
7
8
9
devServer: {
proxy: {
'/api1': {// 匹配所有以 '/api1'开头的请求路径
target: 'http://localhost:5000',
changeOrigin: true,
pathRewrite: {'^/api1': ''}
},
}
}
  • 接口配置属性的解析

    • target:代理目标的基础路径
    • changeOrigin
      • 默认值为true,服务器收到的请求头中的host为:localhost:5000。
      • 为false时,服务器收到的请求头中的host为:localhost:8080
    • pathRewrite:配带冒号前面的字符,将它替换为空字符
    • ws:为true,支持websocket
  • 优劣:

    1. 优点:可以配置多个代理,且可以灵活的控制请求是否走代理。
    2. 缺点:配置略微繁琐,请求资源时必须加前缀。
  • 案例

插槽

  • 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件
  • 分类:默认插槽、具名插槽、作用域插槽
  • 注:以下写法是vue2.6.0以后的,之前的slot和slot-scope废弃

默认插槽:

  • 父组件使用子组件标签,并在开始和结束标签中间添加内容,单标签不添加内容
  • 子组件在页面中使用<slot>父组件传递的内容会插入slot中</slot>
  • 注:默认插槽也有name属性,为default

具名插槽:

  • 适用于多个插槽
  • 父组件在页面中使用子组件标签时,添加内容的模板标签上指定插槽名
    • <template v-slot:插槽名1></template>,并且v-slot只能用在template上
  • 子组件在页面中使用<slot name="插槽名1">父组件传递的内容会插入slot中</slot>

作用域插槽:

  • 理解:在父组件中访问子组件的数据,但是展示的样式由父组件决定/span>
  • 在子组件的插槽标签上中绑定数据:<slot :var="data" name="yu">{{data}}</slot>,这个data是在子组件中定义的
  • 父组件使用子组件标签,在内容区域使用<template v-slot:yu="接收数据的变量名,随意起,且等于子组件的data">...</template>

Vuex(了解即可,现在推荐使用Pinia)

额外补充的知识

  • obj.hasOwnProperty(‘属性名’):判断对象身上是否存在某一元素
其他文章
cover
VUE2-路由(主了解)
  • 24/11/01
  • 13:58
  • VUE
cover
VUE2-基础(主了解)
  • 24/11/01
  • 13:58
  • VUE
目录导航 置顶
  1. 1. 文件结构
  2. 2. 关于不同版本的Vue:
  3. 3. vue.config.js配置文件
  4. 4. ref属性
  5. 5. props配置
  6. 6. mixin(混入)
  7. 7. 插件
  8. 8. style标签的scoped属性
  9. 9. 组件化案例
  10. 10. webStorage
  11. 11. 组件的自定义事件
  12. 12. 全局事件总线(GlobalEventBus)
  13. 13. 消息订阅与发布(pubsub)
  14. 14. nextTick
  15. 15. Vue封装的过度与动画
  16. 16. 解决跨域的方式
  17. 17. 配置代理
    1. 17.1. 开启代理服务器方法一:直接配置proxy
    2. 17.2. 开启代理服务器方法二:配置具体代理规则
  18. 18. 插槽
    1. 18.1. 默认插槽:
    2. 18.2. 具名插槽:
    3. 18.3. 作用域插槽:
  19. 19. Vuex(了解即可,现在推荐使用Pinia)
  20. 20. 额外补充的知识
请输入关键词进行搜索