• 小满Vue3第四十章(Vue响应性语法糖)


    前言:感谢大家辛苦了,迎来了vue系列的第四十章。

    小提示 本章内容所讲的东西都是实验性的产物 暂时不要再生产环境使用,自己开发玩可以使用,不过大体框架应该不会变了。

    要求 vue版本 3.2.25 及以上

    1.开启配置(开启之后才能使用新特性)

    vite 开启 reactivityTransform

    1. import { fileURLToPath, URL } from 'url'
    2. import { defineConfig } from 'vite'
    3. import vue from '@vitejs/plugin-vue'
    4. import vueJsx from '@vitejs/plugin-vue-jsx'
    5. // https://vitejs.dev/config/
    6. export default defineConfig({
    7. server: {
    8. port: 3000
    9. },
    10. plugins: [
    11. vue({
    12. reactivityTransform:true
    13. }),
    14. vueJsx()],
    15. resolve: {
    16. alias: {
    17. '@': fileURLToPath(new URL('./src', import.meta.url))
    18. }
    19. },
    20. })

     

    如果你是 vue-cli

    1. // vue.config.js
    2. module.exports = {
    3. chainWebpack: (config) => {
    4. config.module
    5. .rule('vue')
    6. .use('vue-loader')
    7. .tap((options) => {
    8. return {
    9. ...options,
    10. reactivityTransform: true
    11. }
    12. })
    13. }
    14. }

     第一个例子 $ref

    在之前ref 修改值 和 获取值 都要.value 一下 感觉很繁琐,不想用.value 我们可以使用vue3的新特性$ref 。

    我们可以直接使用$ref 宏函数 就不需要.value 了。能帮我们快速书写,但是宏函数是基于运行时的他最终还是会转换成ref 加.value  只不过vue帮我们做了这个操作了

    1. <template>
    2. <div>
    3. <button @click="add">addbutton>
    4. div>
    5. <h2>
    6. {{count}}
    7. h2>
    8. template>
    9. <script setup lang='ts'>
    10. import { $ref } from 'vue/macros'
    11. let count = $ref(0)
    12. const add = () => {
    13. count++
    14. }
    15. script>
    16. <style>
    17. style>

    当然跟ref 有关的函数都做处理 都不需要.value了

    2.$ref 的弊端

    应为他编译之后就是 count.value 并不是一个ref对象所以watch 无法监听而且会抛出一个警告

    1. [Vue warn]: Invalid watch source:  0 A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types. 
    2.   at <App>
    1. <template>
    2. template>
    3. <script setup lang='ts'>
    4. import { reactive, ref, toRefs,watch } from 'vue';
    5. import { $ref} from 'vue/macros'
    6. let count = $ref(0)
    7. watch(count,(v)=>{
    8. console.log(v)
    9. })
    10. setInterval(()=>{
    11. count++
    12. },1000)
    13. script>
    14. <style>
    15. style>

    解决这个问题需要$$ 符号 就是再让他编译的时候变成一个ref 对象不加.value 

    1. <template>
    2. template>
    3. <script setup lang='ts'>
    4. import { reactive, ref, toRefs,watch } from 'vue';
    5. import { $ref,$$ } from 'vue/macros'
    6. let count = $ref(0)
    7. watch($$(count),(v)=>{
    8. console.log(v)
    9. })
    10. setInterval(()=>{
    11. count++
    12. },1000)
    13. script>
    14. <style>
    15. style>

    3.解构 

    在之前我们解构一个对象使用toRefs 解构完成之后 获取值和修改值 还是需要.value

    vue3 也提供了 语法糖  $() 解构完之后可以直接赋值

    1. <template>
    2. <div>
    3. {{name}}
    4. div>
    5. template>
    6. <script setup lang='ts'>
    7. import { reactive, toRefs } from 'vue'
    8. import {$} from 'vue/macros'
    9. const obj = reactive({
    10. name: '小满'
    11. })
    12. let { name } = $(obj);
    13. setTimeout(()=>{
    14. name = '大满'
    15. },2000)
    16. script>
    17. <style>
    18. style>

  • 相关阅读:
    jps显示java进程不全
    隆重推出 Incredibuild 10
    HarmonyOS 开发之———应用程序入口—UIAbility的使用
    oracle-替换中文、回车、换行、倒序截取等,从OA一堆意见里面找出你想要的审批日期
    机器学习——逻辑回归算法
    C语言知识阶段性总结项目:电子词典
    浅谈 CDN 加速
    phpstudy启动MySQL服务遇到的问题及解决过程
    Windows10环境下Python 开发环境搭建
    【PMI-PMP®模考三】2022
  • 原文地址:https://blog.csdn.net/qq1195566313/article/details/126275355