vue2患者看病,vue3(vue3重头学-基础)

94 阅读3分钟
本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

总结: 这里都是我读完引导的时候感觉出的vue2和vue3的区别,或者说我自己要学习的点,后续会继续读文档,这才是文档的很小的一部分

没有那么多哔哔赖赖,直接开整,记录自己看vue3的学习记录,从vue2的角度学习时,自己需要注意的点记录下来

创建一个应用

createApp 函数是用来创建一个vue应用实例的,

    import { createApp } from 'vue'
    import APP from './App.vue'
    const app = createApp(App)
    app.mount("#app")

App.vue 是根组件, 通过createAPP组件后,创建vue应用实例成功,后续是一样的需要挂载,

应用配置

app.config.errorHandler = (err) => {
    //处理错误
}

这里的配置是处理错误的,一般是子组件的报错处理,这里的函数中要辨别一下http请求的错误处理,不在这里

  app.component('TodoDeleteButton', TodoDeleteButton)

上面代码是注册组件的代码,用实例的component()来注册

模板语法

可能是本人比较菜,暂时觉得模板语法中大致和vue2的类似,所以本模块不做记录

响应式基础

import { reactive } from 'vue'
const state = reactive({ count: 0 }) 

setup() {
    return {
        state
    }
}

dom更新时机 问题 若要等待一个状态改变后的DOM更新完成,可以使用nextTick()

响应式代理 VS 原始对象

上面提的reactive() 返回的是一个原始对象的proxy(), 与原始对象本身是不相等的

const raw = {}
const proxy = reactive({})

console.log(raw === proxy) // false

这里的特性与原来的vue2不同的点是 更改原始对象,不会触发响应式和dom更新,

reactive()的局限性

1:响应式只对对象,数组,map,set这样的有效,对基础数据类型无效 2:我们不可以随意的替换一个响应式对象,这样将会使其失去响应式

用ref()定义基础数据类型的响应式变量

import { ref } from 'vue'
const count = ref(0)
count.value++

可以忽略的章节

计算属性,类与样式绑定,条件渲染,列表渲染,事件处理基本与vue2保持一致, 表单输入绑定中可以看看修饰符

生命周期钩子

这个地方是和vue2有很大差别的地方,钩子函数因为setup和keep-alive时候的activited等的区别,这里得等到深入了解每个钩子函数的api和用例的时候我们再来细细研究

侦听器

watch不能直接侦听响应式对象的属性值,例如:

const obj = reactive({ count: 0})
// 这里会报错,因为第一个参数是一个值,
// 这里正确的是需要返回一个该属性的getter函数
watch(obj.count, (count) => {
    console.log(count)
})

及时回调

watch(source, (newValue, oldValue) => {},{immediate: true})

上面代码会避免一个问题,这就是立刻执行,不然第一次的时候,source初始化的时候不会执行,这就是最后的immediate的作用,

watchEffect()

watchEffect(async () => {
  const response = await fetch(
    `https://jsonplaceholder.typicode.com/todos/${todoId.value}`
  )
  data.value = await response.json()
})

这就是watchEffect的作用,这里我不需要进行指定监听谁,函数会自定监听这里涉及到的响应式依赖,而且不会用设置immediate来立即执行, 总的来说,watch与watchEffect的区别更多的是回调函数的触发时机,还有就是代码简洁度

回调函数的触发时机

当更改了响应式状态,是会触发vue组件更新和侦听器回调的,默认情况是先进行侦听器函数回调,之后是vue组件更新被调用,如果想回调函数是可以访问更新后的组件及更新后的dom,可以设置watch和watchEffect选项{flush: 'post'} 在vue中,watchEffect的flush选项有别名,叫:watchPostEffect

停止侦听器

手动停止一个镇日干起,

const unwatch = watchEffect(() => {})
// ...当该侦听器不再需要时
unwatch()

模板引用

直接访问底层DOM元素,才会用到ref,这里的ref是一个特殊的html属性,

在组合式api中获得模板引用,需要声明同名的ref

<script setup>
import { ref, onMounted } from 'vue'

// 声明一个 ref 来存放该元素的引用
// 必须和模板里的 ref 同名
const input = ref(null)

onMounted(() => {
  input.value.focus()
})
</script>

<template>
  <input ref="input" />
</template>

组件基础

对比vue2中,首先是SFC这个缩写,代表单文件组件,以前vue2应该是没有明确这个说法的,虽然很多时候大家都是这么写的,另外就是父子组件通信vue2的props和$mit这里有区别,

<!-- BlogPost.vue -->
    <script setup>
    defineProps(['title'])
    </script>

    <template>
      <h4>{{ title }}</h4>
    </template>

<!-- BlogPost.vue -->
<script setup>
defineProps(['title'])
defineEmits(['enlarge-text'])
</script>

总结: 这里都是我读完引导的时候感觉出的vue2和vue3的区别,或者说我自己要学习的点,后续会继续读文档,这才是文档的很小的一部分