Vue3 学习教程 学习笔记

文章目录


前言

主要做一些Vue3的学习笔记,方便后续查找。查缺补漏


提示:以下是本篇文章正文内容,下面案例可供参考

环境搭建

## 安装或者升级
npm install -g @vue/cli
## 保证 vue cli 版本在 4.5.0 以上
vue --version
## 创建项目
vue create my-project

setup

新的option, 所有的组合API函数都在此使用, 只在初始化时执行一次

  • 执行时机

        在beforeCreate之前执行(一次), 此时组件对象还没有创建。this是undefined, 不能通过this来访问data/computed/methods / props

  • 返回值

        一个对象,用于模板的属性和方法。会与data、methods合并,setup优先级高。

  • 参数

        setup(props, context) / setup(props, {attrs, slots, emit})

import Child from "./Child.vue";
import { defineComponent, ref, reactive } from "vue";
export default defineComponent({
  name: "HomeView",
  components: {
    Child,
  },
setup() {
  const count = ref(1);
  function update() {
    count.value++;
  }
  // 返回一个proxy的代理对象,被代理的是里面的对象
  const user = reactive({
    name: "小明",
    age: 18,
  });
  const update2 = () => {
    user.name += "++";
  };
  return {
    count,
    update,
    user,
    update2,
  };
},
});

ref

定义一个数据的响应式,用来处理基本类型数据(也可以使用对象,要.value)。

reactive

定义多个数据的响应式,用来处理对象(递归深度响应式)。

计算属性与监视

  • computed函数
  • watch函数
  • watchEffect函数
import { defineComponent, reactive, computed, watch, watchEffect } from "vue";
export default defineComponent({
  name: "HomeView",
  components: {},
  setup() {
    const user = reactive({
      firstName: 'A',
      lastName: 'B'
    })
    const fullName1 = computed(()=>{
      console.log('fullName1');
      return user.firstName + '--' + user.lastName;
    })
    const fullName2 = computed({
      get () {
        console.log('fullName2 get')
        return user.firstName + '-' + user.lastName
      },

      set (value: string) {
        console.log('fullName2 set')
        const names = value.split('-')
        user.firstName = names[0]
        user.lastName = names[1]
      }
    })
    watch(user, ({firstName, lastName})=>{
      console.log(firstName, lastName, 1111)
    },{
      immediate: true,  // 是否初始化立即执行一次, 默认是false
      deep: true, // / 是否是深度监视, 默认是false
    });
    /*
      watch多个数据: 
      使用数组来指定
      如果是ref对象, 直接指定
      如果是reactive对象中的属性,  必须通过函数来指定
    */
    watch([() => user.firstName, () => user.lastName, fullName2], (values) => {
      console.log('监视多个数据', values)
    })
    watchEffect(()=>{
      console.log(user.firstName, user.lastName, 2222)
    });// 不需要指定对象,默认带有immediate
    return {
      user,
      fullName1,
      fullName2
    };
  },
});
</script>

生命周期

vue3 对比 vue2生命周期:

  • beforeCreate -> 使用 setup()
  • created -> 使用 setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeDestroy -> onBeforeUnmount
  • destroyed -> onUnmounted
  • errorCaptured -> onErrorCaptured
import { defineComponent, onMounted, onUpdated, onUnmounted, onBeforeMount, onBeforeUpdate, onBeforeUnmount } from "vue";
export default defineComponent({
  name: "HomeView",
  setup() {
    onBeforeMount(() => {
      console.log('--onBeforeMount')
    })
    onMounted(() => {
      console.log('--onMounted 可以放些异步请求')
    })
    onBeforeUpdate(() => {
      console.log('--onBeforeUpdate')
    })
    onUpdated(() => {
      console.log('--onUpdated')
    })
    onBeforeUnmount(() => {
      console.log('--onBeforeUnmount')
    })
    onUnmounted(() => {
      console.log('--onUnmounted')
    })
    return {}
  }
});

toRefs

把一个响应式对象转换成普通对象,该普通对象的每个 property 都是一个 ref

function useReatureX() {
  const state = reactive({
    foo2: 'a',
    bar2: 'b',
  })

  setTimeout(() => {
    state.foo2 += '++'
    state.bar2 += '++'
  }, 2000);

  return toRefs(state)
}

ref

获取组件中的标签元素

const inputRef = ref<HTMLElement|null>(null)

 shallowReactive 与 shallowRef

  • shallowReactive : 只处理了对象内最外层属性的响应式(浅响应式)。与reactive类似;

  • shallowRef:只处理了value的响应式, 不进行对象的reactive处理。与ref类似;

区别:reactive与ref实现的是深度响应式, 而shallowReactive与shallowRef是浅响应式。

readonly 与 shallowReadonly

只读对象。

  • readonly:深度只读。
  • shallowReadonly:浅度只读。
const state = reactive({
      a: 1,
      b: {
        c: 2
      }
    })
const rState1 = readonly(state)
const rState2 = shallowReadonly(state)

toRaw 与 markRaw

  • toRaw:代理对象变成普通对象,数据变化,界面不变化。
  • markRaw:标记的对象数据,再也不能变成代理对象。

toRef与ref

  • toRef:把响应式数据state对象中的某个属性变成ref对象。数据互通,会相互影响。
  • ref:吧响应式对象中的某个属性使用ref进行包装,变成一个ref对象。不会相互影响。
const state = reactive({
    foo: 1,
    bar: 2
})
const foo = toRef(state, 'foo')
const foo2 = ref(state.foo)

customRef

创建一个自定义的 ref,并对其依赖项跟踪和更新触发进行显式控制

provide 与 inject

provideinject提供依赖注入,功能类似 2.x 的provide/inject

响应式数据的判断

  • isRef: 检查一个值是否为一个 ref 对象
  • isReactive: 检查一个对象是否是由 reactive 创建的响应式代理
  • isReadonly: 检查一个对象是否是由 readonly 创建的只读代理
  • isProxy: 检查一个对象是否是由 reactive 或者 readonly 方法创建的代理
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天巨兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值