• 技术文章 >web前端 >Vue.js

    VUE3快速上手及常用API函数汇总!

    藏色散人藏色散人2022-03-24 09:54:39转载197

    Vue3简介

    Vue3带来了什么?

    性能的提升

    源码的升级

    拥抱TypeScript

    新的特性

    相关推荐:《vue.js视频教程

    一、创建Vue3.0工程

    1.使用 vue-cli 创建

    官方文档:https://cli.vuejs.org/zh/guide/creating-a-project.html

    ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
    vue --version
    
    ## 安装或者升级你的@vue/cli
    npm install -g @vue/cli
    
    ## 创建
    vue create vue_test
    
    ## 启动
    cd vue_test
    npm run serve

    2.使用 vite 创建

    Vite 官方中文文档:https://cn.vitejs.dev

    传统构建与vite构建对比图:

    ea5206e0badc5d7c5198a328c1e502d.png

    69db93b1b79ef245bd120e109dd85e2.png

    ## 创建工程
    npm init vite-app <project-name>
    
    ## 进入工程目录
    cd <project-name>
    
    ## 安装依赖
    npm install
    
    ## 运行
    npm run dev

    二、常用 Composition API

    官方文档:https://v3.cn.vuejs.org/guide/composition-api-introduction.html

    1.拉开序幕的setup

    2.ref函数

    3.reactive函数

    4.Vue3.0中的响应式原理

    Vue2.x的响应式

    Object.defineProperty(data, 'count', {
        get() {},
        set() {}})

    Vue3.0的响应式

    new Proxy(data, {
        // 拦截读取属性值
        get(target, prop) {
            return Reflect.get(target, prop)
        },
        // 拦截设置属性值或添加新属性
        set(target, prop, value) {
            return Reflect.set(target, prop, value)
        },
        // 拦截删除属性
        deleteProperty(target, prop) {
            return Reflect.deleteProperty(target, prop)
        }})proxy.name = 'tom'

    5.reactive对比ref

    6.setup的两个注意点

    7.计算属性与监视

    computed函数

    import {
        computed} from 'vue'setup() {
        ...
        // 计算属性——简写
        let fullName = computed(() => {
            return person.firstName + '-' + person.lastName    })
        // 计算属性——完整
        let fullName = computed({
            get() {
                return person.firstName + '-' + person.lastName        },
            set(value) {
                const nameArr = value.split('-')
                person.firstName = nameArr[0]
                person.lastName = nameArr[1]
            }
        })}

    watch函数

    // 情况一:监视ref定义的响应式数据
    watch(sum, (newValue, oldValue) => {
        console.log('sum变化了', newValue, oldValue)
    }, {
        immediate: true
    })
    
    // 情况二:监视多个ref定义的响应式数据
    watch([sum, msg], (newValue, oldValue) => {
        console.log('sum或msg变化了', newValue, oldValue)
    })
    
    /*
    情况三:监视reactive定义的响应式数据
    若watch监视的是reactive定义的响应式数据,则无法正确获得oldValue
    若watch监视的是reactive定义的响应式数据,则强制开启了深度监视
    */
    watch(person, (newValue, oldValue) => {
        console.log('person变化了', newValue, oldValue)
    }, {
        immediate: true,
        deep: false
    }) // 此处的deep配置不再奏效
    
    // 情况四:监视reactive定义的响应式数据中的某个属性
    watch(() => person.job, (newValue, oldValue) => {
        console.log('person的job变化了', newValue, oldValue)
    }, {
        immediate: true,
        deep: true
    })
    
    // 情况五:监视reactive定义的响应式数据中的某些属性
    watch([() => person.job, () => person.name], (newValue, oldValue) => {
        console.log('person的job变化了', newValue, oldValue)
    }, {
        immediate: true,
        deep: true
    })
    
    // 特殊情况
    watch(() => person.job, (newValue, oldValue) => {
        console.log('person的job变化了', newValue, oldValue)
    }, {
        deep: true
    }) // 此处由于监视的是reactive所定义的对象中的某个属性,所以deep配置有效

    watchEffect函数

    // watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调
    watchEffect(() => {
        const x1 = sum.value
        const x2 = person.age
        console.log('watchEffect配置的回调执行了')
    })

    8.生命周期

    Vue2.x的生命周期:
    Vue2.x的生命周期
    Vue3.0的生命周期:

    9.自定义hook函数

    10.toRef

    三、其它 Composition API

    1.shallowReactive 与 shallowRef

    2.readonly 与 shallowReadonly

    3.toRaw 与 markRaw

    4.customRef

    <template>
        <input type="text" v-model="keyword">
        <h3>{{keyword}}</h3>
    </template>
    
    <script>
    import {
        ref,
        customRef
    } from 'vue'
    export default {
        name: 'Demo',
        setup() {
            // let keyword = ref('hello') //使用Vue准备好的内置ref
            // 自定义一个myRef
            function myRef(value, delay) {
                let timer
                // 通过customRef去实现自定义
                return customRef((track, trigger) => {
                    return {
                        get() {
                            track() // 告诉Vue这个value值是需要被“追踪”的
                            return value
                        },
                        set(newValue) {
                            clearTimeout(timer)
                            timer = setTimeout(() => {
                                value = newValue
                                trigger() // 告诉Vue去更新界面
                            }, delay)
                        }
                    }
                })
            }
            let keyword = myRef('hello', 500) // 使用程序员自定义的ref
            return {
                keyword
            }
        }
    }
    </script>

    5.provide 与 inject

    28da193f6d45be8cd5e3f558bb5b5fc.png

    祖先组件中:

    setup() {
        ......
        let car = reactive({
            name: '奔驰',
            price: '40万'
        })
        provide('car', car)
        ......}

    后代组件中:

    setup(props, context) {
        ......
        const car = inject('car')
        return {
            car    }
        ......}

    6.响应式数据的判断

    四、Composition API 的优势

    1.Options API 存在的问题

    使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改。

    2.Composition API 的优势

    我们可以更加优雅地组织我们的代码、函数,让相关功能的代码更加有序地组织在一起。

    五、新的组件

    1.Fragment

    2.Teleport

    <teleport to="移动位置">
        <div v-if="isShow" class="mask">
            <div class="dialog">
                <h3>我是一个弹窗</h3>
                <button @click="isShow = false">关闭弹窗</button>
            </div>
        </div>
    </teleport>

    3.Suspense

    异步引入组件:

    import {
        defineAsyncComponent
    } from 'vue'
    const Child = defineAsyncComponent(() => import('./components/Child.vue'))

    使用Suspense包裹组件,并配置好defaultfallback

    <template>
        <div class="app">
            <h3>我是App组件</h3>
            <Suspense>
                <template v-slot:default>
                    <Child />
                </template>
                <template v-slot:fallback>
                    <h3>加载中...</h3>
                </template>
            </Suspense>
        </div>
    </template>

    六、其他

    1.全局API的转移

    // 注册全局组件
    Vue.component('MyButton', {
        data: () => ({
            count: 0
        }),
        template: '<button @click="count++">Clicked {{ count }} times.</button>'
    })
    
    // 注册全局指令
    Vue.directive('focus', {
        inserted: el => el.focus()
    })
    2.x全局API(Vue3.x实例API(app
    Vue.config.xxxapp.config.xxx
    Vue.config.productionTip移除
    Vue.componentapp.component
    Vue.directiveapp.directive
    Vue.mixinapp.mixin
    Vue.useapp.use
    Vue.prototypeapp.config.globalProperties

    2.其他改变

    Vue2.x写法:

    .v-enter,
    .v-leave-to {
        opacity: 0;}.v-leave,
    .v-enter-to {
        opacity: 1;}

    Vue3.x写法:

    .v-enter-from,
    .v-leave-to {
        opacity: 0;}.v-leave-from,
    .v-enter-to {
        opacity: 1;}

    父组件中绑定事件:

    <my-component
    v-on:close="handleComponentEvent"
    v-on:click="handleNativeClickEvent" />

    子组件中声明自定义事件:

    <script>
        export default {
            emits: ['close'] // 这里声明的事件才算作自定义事件,所以在父组件中click是原生事件
        }
    </script>

    以上就是VUE3快速上手及常用API函数汇总!的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:vue3
    上一篇:vue中emit的用法是什么 下一篇:浅析vue中的生命周期钩子mounted
    Web大前端开发直播班

    相关文章推荐

    • 聊聊Vue3中Provide和Inject的实现原理• 教你5个让Vue3开发更顺畅的知识点• Vue3组件间怎么通讯?10+种通讯方式分享• 宝藏项目!分享一款开箱即用的Vue3组件库:Varlet• 如何快速上手vue3,学会这几个API吧!

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网