Carmineprince's Blog
首页
    • HTML
    • CSS
    • JavaScript
    • Vue
    • React
    • TypeScript
    • Node
    • Flutter
    • Electron
    • Python
    • 运维
    • 重学前端
  • 分类
  • 标签
  • 归档

Ziqi Wang

胡思乱想程序员
首页
    • HTML
    • CSS
    • JavaScript
    • Vue
    • React
    • TypeScript
    • Node
    • Flutter
    • Electron
    • Python
    • 运维
    • 重学前端
  • 分类
  • 标签
  • 归档
  • 从0开始搭建一套规范的Vue3.x项目工程环境
  • 解决vite构建vue3项目报错
  • 解决Vue3中无法使用$ref的问题
  • 项目中手动增加scss支持
  • el-table多选分页保留
  • 解决npm run dev启动两个页面问题
  • PC端和移动端兼容方案
  • SFC-Use-script-setup
  • vue2x面试前回炉重造
  • Vue3+Vite2配置
  • flvjs+vue 视频播放(手动追帧、断开重连、多个视频同时直播)
  • vue平滑滚动到指定位置
  • vant项目使用postcss-pxtorem和amfe-flexible 进行移动端适配
  • vue 使用v-html绑定时,内部元素不会继承外部css的解决方案
  • vue-awesome-swiper缩略图控制循环无效解决方案
  • 如何在Vue项目中优雅的使用svg图标
  • yarn报错及解决方案
  • vue3+ts+vite移动端vw适配方案
  • Vue项目中增加mockjs模拟接口请求
  • Nuxt相关

  • Vue3思考及跟Vue2相比的新变化总结
    • Vue3比Vue2的优势是什么?
    • Vue3的生命周期?
      • 1. Options API的生命周期
      • 2. Composition API生命周期
    • Composition Api 和Options API
      • Composition API带来了什么?
      • 如何抉择?
    • 如何理解ref toRef 和 toRefs?
      • ref
      • toRef
      • toRefs
      • 为何需要ref?
      • 为何需要.value?
      • 为何需要 toRef toRefs?
    • Vue3升级了哪些重要的功能
    • Composition Api如何实现代码逻辑复用
    • Vue3如何实现响应式?
      • Proxy实现响应式
    • watch和watchEffect的区别是什么
    • setup中如何获取组件实例?
    • Vue3为什么比Vue2快?
    • Vite是什么?
    • Composition API和React Hooks的对比
  • Vue相关
carmineprince
2022-02-01

Vue3思考及跟Vue2相比的新变化总结

# Vue3比Vue2的优势是什么?

  • 性能更好
  • 体积更小
  • 更好的TS支持,Vue3是ts开发的
  • 更好的代码组织
  • 更好的逻辑抽离
  • 更多的新功能

# Vue3的生命周期?

# 1. Options API的生命周期

  • beforeDestroy -> beforeUnmount
  • destroyed -> unmouted 仅仅是名字的修改,其他沿用Vue2的生命周期

# 2. Composition API生命周期

setup 等于beforeCreate和created

# Composition Api 和Options API

# Composition API带来了什么?

  • 更好的代码组织
  • 更好的逻辑复用
  • 更好的类型推导

# 如何抉择?

  • 不建议共用,会引起混乱
  • 小型项目,业务逻辑简单,用Options API
  • 中大型项目,业务逻辑复杂,用Composition API

# 如何理解ref toRef 和 toRefs?

# ref

基本使用

setup() {
    // 推荐所有的ref类型变量名增加后缀Ref进行标记。防止后续使用时忘记了时ref类型。
    const ageRef = ref(20) // 值类型 响应式
    const nameRef = ref('carmineprince')
    const state = reactive({
        name: nameRef // ref类型可以直接在reactive中使用
    })
    return {
        ageRef,
        state
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

使用ref获取元素

<template>
  <p ref="elementRef">test ref get element</p>
</template>
<script>
import { ref, onMounted } from 'vue'
export default {
  setup() {
    const elementRef = ref(null)
    // 在加载完成的生命周期才能去获取元素
    onMounted(()=>{
      console.log(elementRef.value.innerHTML)
    })
    return {
      elementRef
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# toRef

<template>
  <p>use toRef</p>
  <p>person.phoneNumber:{{ person1.phoneNumber }} ---- phoneNumberRef:{{ phoneNumberRef }}</p>
  <button @click="handlePhoneNumberChange">
    The value of person.phoneNumber changes, and so does the value of phoneNumberRef
  </button>
</template>
<script lang="ts" setup>
import {reactive, toRef} from 'vue'
const person1 = reactive({
  name: 'carmineprince',
  phoneNumber: '15555555555'
})
const phoneNumberRef = toRef(person1, 'phoneNumber')
const handlePhoneNumberChange = () => {
  person1.phoneNumber = person1.phoneNumber === '15555555555' ? '12222222222' : '15555555555'
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# toRefs

<template>
  <p>use toRefs</p>
  <p>student:{{ student }}</p>
  <p>studentAsRefs:{{ studentAsRefs }}</p>
  <button @click="onStudentChangeClick">change studentAsRefs.age.value</button>
  <button @click="onStudentRefsChangeClick">change student.age</button>
</template>
<script lang="ts" setup>
import {reactive, toRefs} from 'vue'
const student = reactive({
  name: 'carmineprince',
  age: 18
})
const studentAsRefs = toRefs(student)
const onStudentChangeClick = () => {
  student.age = student.age === 18 ? 19 : 18
}
const onStudentRefsChangeClick = () => {
  studentAsRefs.age.value = studentAsRefs.age.value === 18 ? 19 : 18
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 为何需要ref?

  • 返回值类型,会丢失响应式
  • 如在setup,computed,合成函数中,都有可能返回值类型
  • Vue如不定义ref,用户将自造ref,反而混乱

# 为何需要.value?

  • ref是一个对象(不丢失响应式),value储存值
  • 通过.value属性的get和set实现响应式
  • 用于模板、reactive时,不需要.value,其他情况都需要(没有vue编译的)

# 为何需要 toRef toRefs?

  • 初衷:不丢失响应式的情况下,把对象分解/解构
  • 前提:针对的时响应式对象(reactive封装的)非普通对象
  • 注意:不创造响应式,而是延续响应式

# Vue3升级了哪些重要的功能

  • createApp
  • emits属性
  • 生命周期
  • 多事件
  • Fragment
  • 移除.sync
  • 异步组件的写法
  • 移除filter
  • Teleport
  • Suspense
  • Composition API

# Composition Api如何实现代码逻辑复用

  • 抽离逻辑代码到一个函数
  • 函数命名约定为useXxxx格式(React Hooks也是)
  • 在setup中引用useXxx函数

# Vue3如何实现响应式?

# Proxy实现响应式

# watch和watchEffect的区别是什么

# setup中如何获取组件实例?

# Vue3为什么比Vue2快?

# Vite是什么?

# Composition API和React Hooks的对比

上次更新: 2/8/2022, 1:54:46 PM
ubuntu16 TLS nuxt + nginx 部署服务端渲染项目

← ubuntu16 TLS nuxt + nginx 部署服务端渲染项目

最近更新
01
pc端rem配置
03-02
02
使用动态变量ts报错的解决
02-25
03
React Hook详解
02-18
更多文章>
Theme by Vdoing | Copyright © 2021-2022 Carmineprince | 鲁ICP备2021046263号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式