• vue3使用知识点总结


    一、vue3 项目搭建

    npm 6.x

    1. npm init vite@latest myvue3 --template vue
    2. vue 3.2.26

    使用 element plus ui 框架

    npm i -S element plus
    
    1. //全部引入
    2. import ElementPlus from 'element-plus';
    3. import 'element-plus/dist/index.css';
    4. const Vue = createApp(App);
    5. Vue.use(ElementPlus);

    使用 scss

    1. npm install --save-dev sass-loader
    2. npm install --save-dev node-sass
    3. npm install --save-dev sass

    vite.config

    1. import { defineConfig } from 'vite';
    2. import vue from '@vitejs/plugin-vue';
    3. // https://vitejs.dev/config/
    4. export default defineConfig({
    5. publicPath: './', //打包路径
    6. css: {
    7. //配置scss全局变量和方法
    8. preprocessorOptions: {
    9. scss: {
    10. additionalData: "@use './src/assets/scss/style.scss' as *;"
    11. }
    12. }
    13. },
    14. plugins: [vue()]
    15. });

    二、vu3 语法部分

    生命周期

    vue2vue3
    beforeCreatesetup
    createdsetup
    beforeMountonBeforeMount
    mountedonMounted
    beforeUpdateonBeforeUpdate
    updatedonUpdated
    beforeDestoryonBeforeUnmount
    destoryedonUnmounted

    路由

    1. import { useRoute,useRouter } from 'vue-router';
    2. const router = useRouter();
    3. const route = useRoute();

    状态管理

    1. import {useStore} from 'vuex';
    2. const store = useStore();

    reactive

    返回对象的响应式副本

    注意:
    reactive 返回的对象,重新赋值丢失响应式
    reactive 返回的对象不可以解构

    1. const form = reactive({
    2. name: 'aa',
    3. age: 20
    4. });
    5. const { name, age } = form; //通过解构 此时name,age会丢失响应 要想让它具有响应式 需要通过toRefs处理
    6. const { name, age } = toRefs(form); //此时name,age具有响应

    ref

    所有通过 ref 创建的数据 需要通过 xxx.value 取它的值, 在模板中无需通过.value。
    可以简单地把 ref(obj) 理解为这个样子 reactive({value: obj})

    1. import { ref } from "vue";
    2. const count = ref(1);
    3. console.log(cout.value); //1
    • ref获取单个dom元素
    1. <div ref="root"></div>
    2. import { ref } from "vue";
    3. const root = ref(null);
    4. onMounted(() => {
    5. console.log(root.value) //dom元素
    6. }),
    • ref获取v-for中dom元素
    1. <ul>
    2. <li :ref="setLiDom" v-for="(item, index) in state.list" :key="index">
    3. {{ item }}
    4. </li>
    5. </ul>
    6. import { ref, reactive } from "vue";
    7. const state = reactive({
    8. list: [1, 2, 3, 4]
    9. })
    10. const refList = ref([]);
    11. const setLiDom = (el) => {
    12. if(el){
    13. liItem.value.push(el);
    14. }
    15. };
    16. onMounted(() => {
    17. console.log(root.value) //Proxy {0: li, 1: li, 2: li, 3: li}
    18. }),

    toRef 和 toRefs

    • toRef 用来为源响应式对象上的某个 property 新创建一个 ref。
    1. const state = reactive({
    2. foo: 1,
    3. bar: 2
    4. });
    5. //目的使state对象中的foo属性保持响应式连接,修改其中一个都会同步修改那个属性
    6. const fooRef = toRef(state, 'foo');
    • toRefs 将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref。
    1. //toRefs常用于 es6 的解构赋值操作,保持每个属性的都为响应式
    2. setup(){
    3. let data = reactive({
    4. name: '张三',
    5. age: 18
    6. });
    7. return {
    8. ...toRefs(data)
    9. }
    10. }

    toRaw 、markRaw

    通过toRaw获取到原始对象,改变原始对象的值会同时改变响应式对象的值,但不会更新视图

    1. const foo = {}
    2. const reactiveFoo = reactive(foo)
    3. //reactiveFoo 和 foo 是引用的同一个地址
    4. console.log(toRaw(reactiveFoo) === foo) // true

    通过markRaw包裹的原始对象,使其永远不会转换为响应式对象,也就是说转换之后修改值并不会更新视图

    1. const foo = markRaw({})
    2. console.log(isReactive(reactive(foo))) // false

    unref

    如果参数是一个 ref,则返回内部值,否则返回参数本身

    1. let obj = ref({ a: 1, b: 2 });
    2. let reult = isRef(obj) ? obj.value : obj;
    3. //等价于
    4. let reult = unref(obj);

    shallowRef 和 triggerRef

    1. setup() {
    2. //shallowRef创建一个比ref更浅的响应式对象,改变其属性值,不会触发监听
    3. const foo = shallowRef({
    4. a: 1111,
    5. b: 2222
    6. });
    7. setTimeout(() => {
    8. foo.value.a = 3333;
    9. triggerRef(foo); //需要手动触发才能改变a的值
    10. }, 2000);
    11. watchEffect(() => {
    12. console.log(foo.value.a); //1111 3333
    13. });
    14. return {
    15. foo
    16. };
    17. }

    defineProps 和 defineEmits