• Vue3使用方法


    Vue3相比于Vue2

    1. 解决了:Vue2中新增属性,删除属性,界面不会更新的问题。
    2. 解决了:Vue2中直接通过下标修改数组,界面不会刷新的问题。

    vue-cli版本必须是4.5以上,查看版本命令:vue -V

    创建工程命令:vue create 项目名

    项目中添加vue.config.js与README同级

    关闭语法检查

    1. module.exports = {
    2. transpileDependencies: true,
    3. lintOnSave: false, /*关闭语法检查*/
    4. }

    setup函数

    1. 理解:Vue3.0中一个新的配置项,值为一个函数。
    2. setup是所有Composition API的“表演舞台”。
    3. 组件中所用到的:数据,方法等等,都要配置在setup中。
    4. setup函数的两种返回值:
      1. 若返回一个对象,则对象中的属性,方法,在模板中都可以使用!
      2. 若返回一个渲染函数:可以定义渲染内容(了解).
    5. 注意点:
      1. 尽量不要与Vue2配置混用。
        1. Vue2配置(data,methos,computed...)中可以访问到setup中的属性,方法。
        2. 但setup中不能访问到vue2配置(data,methos,computed...)。
        3. 如果重名,setup中的优先。
      2. setup不能是async函数,因为返回值不再是return的对象,而是promise,木板看不到return对象中的属性。
    6. 示例

      1. <template>
      2. <h2>姓名:{{name}}h2>
      3. <h2>姓名:{{age}}h2>
      4. <button @click="fun">按钮button>
      5. template>
      6. <script>
      7. export default {
      8. name: 'App',
      9. setup(){
      10. let name='李义新';
      11. let age=10;
      12. function fun(){
      13. alert(`姓名:${name} 年纪:${age}`);
      14. }
      15. //返回一个对象(常用)
      16. return {
      17. name,age,fun
      18. }
      19. //返回一个渲染函数(不常用)
      20. //return ()=> h('h1','尚硅谷')
      21. }
      22. }
      23. script>

    setup的两个注意点

    1. setup执行的时机
      1. 在beforeCreate之前执行一次,this是undefine
    2. setup的参数
      1. props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。
    3. context:上下文对象
      1. attrs:值为对象,包含组件外部传递过来,但没有在props配置中声明的属性。
      2. slots:收到的插槽内容,想到相当于this.$slots。
      3. emit:分发自定义事件的函数,相当于this.$emit。

     ref函数

    1. 作用:定义一个响应式的数据。
    2. 语法:let xxx = ref(initValue)
      1. 创建一个包含响应式数据的引用对象(reference对象)。
      2. JS中操作数据:xxx.value
      3. 模板中读取数据,不需要.value,直接:
        {{xxx}}
    3. 接收的数据可以是基本类型,也可以是对象类型。
    4. 基本类型的数据:响应式依然是靠Object.defineProperty()的get与set完成的。
    5. 对象类型的数据:内部使用了Vue3中的一个新函数:reactive函数
    6. 示例
      1. <template>
      2. <h2>姓名:{{name}}h2>
      3. <h2>工作:{{job.type}}h2>
      4. <button @click="fun">按钮button>
      5. template>
      6. <script>
      7. //引入ref
      8. import {ref} from "vue"
      9. export default {
      10. name: 'App',
      11. setup(){
      12. let name=ref('李义新');
      13. let job = ref({
      14. type:"前端工程师"
      15. })
      16. function fun(){
      17. name.value="李二新";
      18. job.value.type="后端工程师"
      19. }
      20. return {
      21. name,job,fun
      22. }
      23. }
      24. }
      25. script>

    reactive函数

    1. 作用:定义一个对象类型的响应式数据(基本类型数据不能用,要用ref函数)。
    2. 语法:const 代理对象=reactive(原函数),接收一个对象或数组,返回一个代理对象(proxy对象)。
    3. reactive定义的响应式数据是深层次的。
    4. 内部基于ES6的Proxy实现,通过代理对象操作源内部数据进行操作。
    5. 用法与ref创建的代理对象类似,不过操作时不需要再加.value
      1. <template>
      2. <h2>工作:{{job.type}}h2>
      3. <h2>工作:{{job.xin.name}}h2>
      4. <button @click="fun">按钮button>
      5. template>
      6. <script>
      7. //引入ref
      8. import {reactive} from "vue"
      9. export default {
      10. name: 'App',
      11. setup(){
      12. let job = reactive({
      13. type:"前端工程师",
      14. xin:{
      15. name:"xxx"
      16. }
      17. })
      18. function fun(){
      19. job.type="后端工程师";
      20. job.xin.name="哈哈哈";
      21. }
      22. return {
      23. job,fun
      24. }
      25. }
      26. }
      27. script>

    reactive对比ref

    1. 从定义数据角度对比

      1. ref用来定义:基本类型数据。

      2. reactive用来定义:对象(或数组)类型数据。

      3. 备注:ref也可以用来定义对象(或数组)类型数据,它内部会自动通过reactive转为代理对象。

    2. 从原理角度对比:

      1. ref通过Object.defineProperty()的get与set实现响应式(数据劫持)。

      2. reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect操作源对象内部的数据。

      3. 从使用角度对比:

        1. ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value。

        2. reactive定义的数据:操作数据与读取数据:均不需要.value。

    computed函数

    Vue2中的computed一样。

    1. import {computed} from 'vue'
    2. setup(){
    3. //计算属性简写
    4. let fullName = computed(()=>{
    5. return 1+1;
    6. })
    7. //计算属性完整
    8. let fullName = computed({
    9. get(){
    10. return 1+1;
    11. },
    12. set(value){
    13. a = value;
    14. }
    15. })
    16. }

    watch函数

    参数:watch(监视的属性或者对象,(newVal,oldVal)={},{配置项})

    watch函数使用的六种情况

    1. <template>
    2. <h2>总和:{{sum}}h2>
    3. <h2>一共:{{count}}h2>
    4. <h2>工作:{{job.type}}h2>
    5. <h2>工作:{{job.xin.name}}h2>
    6. <button @click="sum++">sum++button>
    7. <button @click="count++">count++button>
    8. template>
    9. <script>
    10. //引入ref
    11. import {ref,watch,reactive} from "vue"
    12. export default {
    13. name: 'App',
    14. setup(){
    15. let sum = ref(0);
    16. let count = ref(0);
    17. let job = reactive({
    18. type:"前端工程师",
    19. name:"李义新",
    20. xin:{
    21. name:"xxx"
    22. }
    23. })
    24. //情况一:监视ref所定义的一个响应式数据,第三个参数是配置项
    25. watch(sum,(newValue,oldValue)=>{
    26. console.log("sum改变了")
    27. },{immediate:true})
    28. // //情况二:监视ref所定义的多个响应式数据
    29. watch([sum,count],(newVal,oldVal)=>{
    30. console.log("sum或者count改变了",newVal,oldVal)
    31. },{immediate:true})
    32. //情况三:监视reactive所定义的一个响应式数据
    33. //1.注意:次数无法正确的获取oldValue
    34. //2.注意:强制开启了深度监视(depp配置无效)
    35. watch(job,()=>{
    36. console.log("job改变了")
    37. },{immediate:true})
    38. //情况四:Jin啊哈斯reactive所定义的一个响应式数据中的某个属性
    39. watch(()=>job.type,()=>{
    40. console.log("job.type改变了")
    41. },{immediate:true})
    42. //情况五:监视reactive所定义的一个响应式数据中的某些属性
    43. watch([()=>job.type,()=>job.name],()=>{
    44. console.log("job.type或者job.name改变了")
    45. },{immediate:true})
    46. //特殊情况,如果监视的属性是对象,需要开启深度监视
    47. watch(()=>job.xin,()=>{
    48. console.log("job.type或者job.name改变了")
    49. },{immediate:true,deep:true})
    50. function fun(){
    51. job.type="后端工程师";
    52. job.xin.name="哈哈哈";
    53. console.log(this);
    54. }
    55. return {
    56. sum,count,job,fun
    57. }
    58. }
    59. }
    60. script>

    watchEffect函数

    1. watch的套路是:既要指明监视的属性,也要指明监视的回调。
    2. watchEffect的套路是:不用指明监视哪个属性,监视的回调函数中用到哪个属性,就监视哪个属性。
    3. watchEffect有点像computed:
      1. 但computed注重的计算出来的值(回调函数的返回值),所以必须要写返回值。
      2. 而watchEffect更注重的是过程(回调函数中的函数体),所以不用写返回值。
        1. //watchEffact所指定的回调中用到的数据只要发生变化,则直接重新执行回调
        2. watchEffect(()=>{
        3. const x1=sum.value
        4. const x2=parson.age
        5. console.log('watchEffer配置的回调执行了')
        6. })

    生命周期钩子

    Vue3中可以继续使用Vue2中的生命钩子,但是有两个函数改名了:

    Vue2Vue3
    beforeDestroy()beforeUnmout()
    destroyed()unmounted()

    Vue3也提供了Composition API形式的生命钩子,如果在setup与配置项中都写了钩子,写在setup中的钩子执行优先级比写在配置项中高,使用之前需要先import引入,与Vue2中钩子对应关系如下:

    Vue2Vue3
    beforeCreate()setup()
    create()setup()
    beforeMount()onBeforeMount()
    mounted()onMounted()
    beforeUpdate()onBeforeUpdate()
    updated()onUpdated()
    beforeUnmount()onBeforeUnmount()
    unmounted()onUnmounte()

    Hook函数

    1. hook本质是一个函数,把setup函数中使用的Composition API进行封装。
    2. 类似于vue2中的mixin。
    3. 自定义hook的有事:复用代码,让setup中的逻辑更清楚易懂。

    示例

    hooks/hook.js

    1. import {onMounted,onBeforeUnmount,reactive} from "vue"
    2. export default function(){
    3. let point = reactive({
    4. x:0,
    5. y:0
    6. })
    7. function savePoint(event){
    8. point.x=event.pageX
    9. point.y=event.pageY
    10. console.log("X:",event.pageX," Y:",event.pageY)
    11. }
    12. onMounted(()=>{
    13. window.addEventListener("click",savePoint)
    14. })
    15. onBeforeUnmount(()=>{
    16. window.removeEventListener("click",savePoint)
    17. })
    18. return point;
    19. }

    App.vue

    1. <template>
    2. <h2>X:{{point.x}} Y:{{point.y}}h2>
    3. template>
    4. <script>
    5. import hookFun from "./hooks/hook"
    6. export default {
    7. name: 'App',
    8. setup(){
    9. let point=hookFun();
    10. return {
    11. point
    12. }
    13. }
    14. }
    15. script>

    toRef与toRefs函数

    1. 作用:创建一个ref对象,其value值指向另一个对象中的某个属性。
    2. 语法:const name = toRef(person,'name')。
    3. 应用:要将响应式对象中的某个属性单独提供给外部使用。
    4. 扩展:toRefs与toRef功能一致,但可以批量创建多个ref对象,语法:toRefs(person)。
    1. <template>
    2. <h2>{{name}}h2>
    3. <h2>{{xin}}h2>
    4. <h2>{{mes}}h2>
    5. <button @click="fun">按钮button>
    6. template>
    7. <script>
    8. import { reactive, toRef, toRefs } from '@vue/reactivity'
    9. export default {
    10. name: 'App',
    11. setup(){
    12. const obj=reactive({
    13. name:"李义新",
    14. mes:"haha",
    15. xin:{
    16. age:11,
    17. sex:"男"
    18. }
    19. })
    20. const name=toRef(obj,"name");
    21. const xin=toRef(obj,"xin");
    22. function fun(){
    23. obj.name='李二新',
    24. obj.xin.age=222
    25. }
    26. return {
    27. name,xin,fun,
    28. ...toRefs(obj) //把所有属性都封装成Ref类型
    29. }
    30. }
    31. }
    32. script>

    shallowReactive与shallowRef

    1. shallowReactive:只处理对象外层属性的响应式(浅响应式)。
    2. shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。
    3. 什么时候使用:
      1. 如果有一个对象数据,结构比较深,但变化时只是外层属性变化=>shallowReactive。
      2. 如果有一个对象数据,后续功能不会修改该对象中的属性,而是用新的对象替换=>shallowRef

     readonly与shallowReadonly

    1. readonly:让一个响应式数据变为只读的(深只读)。
    2. shallowReadonly:让一个响应式数据变为只读的(浅只读)。
    3. 应用场景:不希望数据被修改。
    4. 使用方法:person = readonly(person)。

    toRaw与markRaw

    1. toRaw:
      1. 作用:将一个由reactive生成的响应式对象转为普通对象。
      2. 使用场景:用于读取响应式对象的普通对象,对这个普通对象的所有操作,不会引起页面的更新。
    2. markRaw:
      1. 作用:标记一个对象,使其永远不会再成为响应式对象。
      2. 使用场景:
        1. 有些值不应该被设置为响应式的,例如负责的第三方类库等。
        2. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高效率。

    customRef 

    1. 作用:创建一个自定义的ref,并对其依赖项跟踪和更多触发进行显式控制。
    2. 示例:输入后延时显式,并防抖
      1. <template>
      2. <input type="text" v-model="keyWord">
      3. <h3>{{keyWord}}h3>
      4. template>
      5. <script>
      6. import {ref,customRef} from 'vue'
      7. export default {
      8. name: 'App',
      9. setup() {
      10. //自定义一个ref——名为:myRef
      11. function myRef(value,delay){
      12. let timer
      13. return customRef((track,trigger)=>{
      14. return {
      15. get(){
      16. console.log(`有人从myRef这个容器中读取数据了,我把${value}给他了`)
      17. track() //通知Vue追踪value的变化(提前和get商量一下,让他认为这个value是有用的)
      18. return value
      19. },
      20. set(newValue){
      21. console.log(`有人把myRef这个容器中数据改为了:${newValue}`)
      22. clearTimeout(timer)
      23. timer = setTimeout(()=>{
      24. value = newValue
      25. trigger() //通知Vue去重新解析模板
      26. },delay)
      27. },
      28. }
      29. })
      30. }
      31. // let keyWord = ref('hello') //使用Vue提供的ref
      32. let keyWord = myRef('hello',500) //使用程序员自定义的ref
      33. return {keyWord}
      34. }
      35. }
      36. script>

     provide与inject

    1. 作用:实现祖孙组件间通信,并且传递的数据是响应式的。
    2. 套路:父组件有一个provide选项来提供数据,子组件有一个inject选项来开始使用这些数据。
    3. 具体用法:
      1. 祖组件中:
        1. setup(){
        2. let car = reactive({name:"xin",price:"100k"})
        3. provide('car',car);
        4. }
      2. 孙组件中:

        1. setup(){
        2. const car = inject('car');
        3. return{car};
        4. }

    响应式数据的判断

    1. isRef:检查一个值是否为一个ref对象。
    2. isReactive:检查一个对象是否由reactive创建的响应式代理。
    3. isReadonly:检查一个对象是否由readonly创建的只读代理。
    4. isProxy:检查一个对象是否由reactive或者readonly方法创建的代理。

    Fragment标签(了解)

    1. 在Vue2中,组件必须有一个根标签。
    2. 在Vue3中,组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中。
    3. 好处:减少标签层级,减少内存占用。

    Teleport

    Teleport是一种能够将我们的组件html结构移动到指定位置的技术。

    参数to中可以写标签,也可以写css选择器。

    1. <teleport to="body">
    2. <div>
    3. <div>
    4. <h1>我是一个标签h1>
    5. div>
    6. div>
    7. teleport>

    Suspense

    1. 等待异步组件时渲染一些额外内容,让应用有更高的用户体验
    2. 使用步骤:
      1. 异步引用组件。
      2. 使用Suspense包裹组件,并配置default与fallback。
      3. 没有加载完成前显示falback中的内容,加载完成后显示suspense中的内容。
    3. 示例
      1. <template>
      2. <div>
      3. <h1>我是App组件h1>
      4. <Suspense>
      5. <template v-slot:default>
      6. <Child/>
      7. template>
      8. <template v-slot:default>
      9. <h2>稍等,加载中。。。h2>
      10. template>
      11. Suspense>
      12. div>
      13. template>
      14. <script>
      15. import {defineAsyocComponent} from 'vue'
      16. const Child = defineAsyncComponent(()=>import('./components/Child.vue'))
      17. export default {
      18. name:"App",
      19. components:{Child}
      20. }
      21. script>

  • 相关阅读:
    数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案
    Opengl ES之矩阵变换(上)
    AIGC生成式人工智能的概念和孵化关键里程碑
    HTML5期末大作业:基于HTML+CSS+JavaScript茶文化中国水墨风格绿色茶叶销售(5页) 学生网页设计作业源码
    pinia的基本使用和核心实现原理
    Express.js实现注册和登录
    Web应用的工作原理
    mysql表操作
    网络安全(黑客)自学
    Laravel使用Queue队列的技巧汇总
  • 原文地址:https://blog.csdn.net/LYXlyxll/article/details/126408147