iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3.2.x中的小技巧及注意事项总结
  • 809
分享到

Vue3.2.x中的小技巧及注意事项总结

2024-04-02 19:04:59 809人浏览 独家记忆
摘要

目录前言小技巧关于减少.value的使用关于减少import导入语句关于在script setup中声明组件名字注意事项关于响应式的问题模板循环中加不加key的问题总结前言 vue3

前言

vue3在2022年的2月7号成为了Vue默认版本,并且随之而来的还有vue3的新文档, 并且从实际使用的角度来说, vue3确实比vue2使用起来更加的舒服,所以觉得经过一段时间的使用,来分享一下使用过程中的小技巧以及注意事项。

小技巧

关于减少.value的使用

  • 使用watch来监听Ref数据的时候, 可以做到省略.value的使用, 例如:

      const value = ref(1);
      // 省略() => value.value
      watch(value, (v) => {
        // 省略v.value
        console.log(v);
      }, { immediate: true });
    
      setTimeout(() => {
        value.value = 2;
      }, 1000);
  • 使用vue3.2.25以上版本提供的$ref, 还是跟上面的代码实现一样的功能

    该功能是一个实验性能, 需要相应的配置, 这里以vite为例, 需要在vite.config.ts的vue plugin中添加一个ReactivityTransfORM属性, 请看下面的配置。如果用的是其他工程化工具, 可以参考vue的新文档, 文档中有详细的说明。

      plugins: [
        vue({
          reactivityTransform: true,
        })
      ]
      const count = $ref(1);
      // 增加了() => count
      watch(
        () => count,
        (v) => {
          console.log(v);
        },
        { immediate: true }
      );
    
      setTimeout(() => {
        // 省略了count.value
        count++;
      }, 1000);

输出:

这里需要说明一下使用$ref需要注意的问题, 首先该功能是一个实验性性能, 需要相应的配置, 并且vue的文档中指出该方法是一个编译器宏使用时无需引入, 但为了ts和编辑器的无端报错, 个人还是喜欢显示的引入, 就像这样import { $ref } from 'vue/Macros'接着再说一下$ref的另一个很严重的问题, 就是丢失响应式, 为什么会丢失响应式呢? 其实这部分官方文档已经做出了说明, 请看下面的代码

// App.vue
import { $ref } from "vue/macros";
import { useApp } from "./App";
let count = $ref(1);

useApp(count);

setTimeout(() => {
  console.log("change");
  count++;
}, 1500);

// App.ts
import { watch } from "vue";
export const useApp = (count) => {
  watch(
    () => count,
    (c) => {
      console.log("watch", c);
    },
    { immediate: true }
  );
};

上面代码中App.ts里面的watch只会执行一次, 很明显, count丢失了响应性
如何解决这个问题呢?请看下面的代码:

// App.vue
import { $ref, $$ } from "vue/macros"; // 引入$$
import { useApp } from "./App";
let count = $ref(1);

useApp($$(count)); // useApp(count) --> useApp($$(count))

setTimeout(() => {
  console.log("change");
  count++;
}, 1500);

// App.ts
import { watch } from "vue";
export const useApp = (count) => {
  watch(
    count, // () => count --> count
    (c) => {
      console.log("watch", c);
    },
    { immediate: true }
  );
};

可以看到, 我们在传递$ref值的时候 需要用一个$$方法包裹一下, 这样就不会丢失响应性了, 具体更详细的使用方法, 还是希望大家仔细阅读一下vue的新文档

关于减少import导入语句

发现这个功能是无意间的,在使用element-plus的时候, 查看elment-plus官网 指南 快速开始, 其中提到了自动导入的功能, 文档中说的是 首先下载对应的插件npm install -D unplugin-vue-components unplugin-auto-import, 然后如果使用的是vite的话, 需要在vite.config中添加几条配置, 就像下面一样:

// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default {
  plugins: [
    // ...
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
}

因为好奇去看了这两个包的介绍, 发现不光可以自动导入组件, 还可以自动导入方法, 例如心细的小伙伴已经发现, .value那部分的代码 不管是ref还是$ref我都没有写import语句来导入, 这里就用到了这两个插件, 我们来看一下如果要自动导入vue的方法对应的配置。

// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default {
  plugins: [
    // ...
    AutoImport({
      imports: ["vue", "vue/macros"],  // 增加这一行代码
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
}

在这样的配置下就可以愉快的减少import导入了。

关于在script setup中声明组件名字

在script setup的方式刚发布的时候, 我就一直在纠结这个问题, 因为项目中有很多的递归组件, 如果没有name来做标识的话, 势必会产生问题

  • 刚开始vue的issues中其他用户提出的解决方式是在.vue文件中定义两个script标签, 其中一个用来定义组件的name, 而另一个用来编写组件逻辑, 例如下面这样:

这种方式相信对于一些有强迫症或者完美主义者来说是完全不能接受的, 包括我 也不能接受, 所以在vue的issues中就有一个用户开发了一个插件来解决这个问题。

  • unplugin-vue-define-options插件

下载插件npm i unplugin-vue-define-options -D我们直接来看一下这个插件的使用方式:

在vite中使用

// vite.config.ts
import DefineOptions from 'unplugin-vue-define-options/vite'
import Vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [Vue(), DefineOptions()],
})

ts项目需要在tsconfig.json中添加一个配置

{
  "compilerOptions": {
    "types": ["unplugin-vue-define-options"]
  }
}

使用方式

<script setup lang="ts">
  defineOptions({
    name: 'App'
  })
</script>

该插件的功能远远不止定义组件的name, 还可以定义组件的props、emits、render等,有兴趣的小伙伴可以去看一下,感觉可以利用这一特性才做一些骚操作,不过尤大大觉得这种方式不太好。

注意事项

关于响应式的问题

  • props不能使用解构的方式来使用, 例如下面的例子
  // Parent.vue
  <template>
    <ChildVue ref="childRef" v-bind="data" />
  </template>
  
  <script setup lang="ts">
    import { reactive } from 'vue';
    import ChildVue from "./views/Child.vue";
    const data = reactive({ name: 'veloma' });
    setTimeout(() => {
      data.name = 'timer';
    }, 1500);
  </script>

  // Child.vue
  <template>
    <div>{{ data.name }}</div>
  </template>

  <script lang="ts" setup>
    const props = defineProps<{
      name: string;
    }>();
    const data = reactive({ ...props });
  </script>

上面的例子在子组件中, 通过reactive将props进行了解构, Parent组件中1.5s后更新name, 这时我们会发现Child组件中的模板并不会产生更新, 那如何来解决这个问题呢?
首先有两种解决方式:

1.使用3.2.25或以上的版本直接解构defineProps, 例如这样 const { name } = defineProps<{ name: string }>()

2.或者通过computed来解构, 例如 const data = computed(() => ({ ...props }))

模板循环中加不加key的问题

关于这个问题, 在vue新文档中有提到这样一句话

只看这句话的话是没有任何问题的,但在实际的使用过程中, 举个?:

    // Parent.vue
    <template>
      <div>
        <ChildVue v-for="item of list" v-bind="item"></ChildVue>

        <button @click="onClick">按钮</button>
      </div>
    </template>
    <script setup lang="ts">
      import { ref } from "vue";
      import ChildVue from "./views/Child.vue";

      const list = ref([{ name: "veloma" }, { name: "timer" }, { name: "lucy" }]);

      const onClick = () => {
        console.log('点击');
        const item = { ...list.value[0] };
        item.name = "veloma1111";
 
        list.value[0] = item;
     };
    </script>
    
    // Child.vue
    <template>
      <div>{{ name }}</div>
    </template>

    <script lang="ts" setup>
      import { onMounted } from "vue";

      defineProps<{
        name: string;
      }>();

      onMounted(() => {
        console.log("mounted");
      });
    </script>

我们看上面的代码会发现功能非常的简单, 子组件接收一个name属性, 父组件循环渲染子组件, 且子组件中有一个onMounted钩子, 我们希望的是, 当点击按钮的时候触发子组件的onMounted钩子, 乍一看是没有任何问题的, 但实际是不会触发的, 看结果:

我们发现click事件确实触发了, 而数据也确实变化了, 页面也变化了, 但就是没有触发子组件的onMounted钩子, 那这是怎么回事呢?实际上在vue处理这一步的时候 重用了之前name为veloma的Child组件, 重用不会产生挂载, 也就不会触发onMounted钩子, 那要怎么解决呢?其实很简单, 只需要给Child组件一个key即可.

总结

到目前为止其实还有好多公司没有升级到vue3, 但是我相信 在不久的将来 甚至就是今年, vue3 + vite + typescript 一定会覆盖大部分的公司, 所以建议小伙伴们还是需要仔细认真的多看两遍vue的新文档, 系统的了解一下vue3的变化为以后的升级做好准备, 加油!

到此这篇关于Vue3.2.x中的小技巧及注意事项的文章就介绍到这了,更多相关Vue3.2.x小技巧内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue3.2.x中的小技巧及注意事项总结

本文链接: https://www.lsjlt.com/news/147666.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3.2.x中的小技巧及注意事项总结
    目录前言小技巧关于减少.value的使用关于减少import导入语句关于在script setup中声明组件名字注意事项关于响应式的问题模板循环中加不加key的问题总结前言 vue3...
    99+
    2024-04-02
  • 关于BindingResult的使用总结及注意事项
    目录BindingResult总结及注意事项相关的校验API空检查长度检查Booelan检查日期检查其他验证数值检查项目使用中遇到的问题BindingResult作用原理Bindin...
    99+
    2024-04-02
  • C++中vector容器的注意事项总结
    目录容量(capacity)和大小(size)的区别容器扩容的本质emplace_back()和push_back()的区别emplace()和insert()的区别附:如果vect...
    99+
    2024-04-02
  • BeanUtils.copyProperties使用总结以及注意事项说明
    目录1.前言2.一般使用3.拷贝属性时忽略空值4.使用注意事项(1)5.使用注意事项(2)6.使用注意事项(3)1.前言 开发过程中,讲一个对象的属性和值赋值到另一个对象上,大量使用...
    99+
    2024-04-02
  • Java方法的返回值及注意事项小结
    目录方法的返回值为什么要有带返回值的方法呢?带返回值方法的定义和调用:1.带返回值方法定义的格式:2.带返回值方法的调用格式:练习1:练习2:方法的注意事项:return关键字:方法...
    99+
    2023-05-17
    Java方法的返回值 Java返回值
  • oracle 11g的安装注意事项总结
    oracle 11g 安装注意事项 1、首先时这个配置安全更新页面,不需要填写电子邮件,下面安全更新也取消候选,否则一旦出现软件更新,会拖慢我们的使用进度 2、在安装选项这里,就选...
    99+
    2024-04-02
  • python切片中内存的注意事项总结
    1、由于 Python 列表的切片会在内存中创建新对象,因此需要注意的另一个重要函数是itertools.islice。 2、通常需要遍历切片,而不仅仅是在内存中静态创建它。isli...
    99+
    2024-04-02
  • Python开发注意事项:处理数据时的注意事项和技巧
    Python开发是一项广泛应用的编程任务,无论是数据分析、机器学习、Web开发还是其他领域,都可以借助Python来完成。在处理数据时,有一些注意事项和技巧,可以帮助开发者更高效地完成任务和避免潜在的问题。本文将介绍一些Python开发中处...
    99+
    2023-11-22
    数据处理技巧: 数据转换 数据处理技巧: 数据分析
  • Python 中数组操作函数的注意事项及面试技巧!
    Python 中的数组操作是非常重要的,因为数组是一种常见的数据结构,它可以帮助我们存储和处理大量的数据。在 Python 中,有很多数组操作函数可以帮助我们快速地操作数组。但是,在使用这些函数时,我们也需要注意一些细节。本文将介绍 Pyt...
    99+
    2023-11-06
    函数 数组 面试
  • 总结github中下载APP的步骤和注意事项
    在如今的数字时代,GitHub已经成为了世界上最大的在线代码托管平台之一。你可以从GitHub上下载数以千计的应用程序,它们经过严格的质量保证和安全测试,在整个开源社区中备受尊重。当然,在GitHub上下载应用程序可能是一个有挑战性的任务,...
    99+
    2023-10-22
  • Golang中字符串转义的技巧与注意事项
    Golang中除了普通的字符串赋值外,还有许多转义字符串的方法,这些方法有不同的适用场景和注意事项。本文将为大家介绍Golang中字符串转义的技巧与注意事项,并提供具体的代码示例,希望...
    99+
    2024-02-23
    字符串 golang 转义 sql语句
  • MySQL时间设置注意事项的深入总结
    时间真的存在吗?有观点认为,时间只是人类构想出来的一种概念,是用来衡量事物变化的标准。对于数据库来说时间伴随着数据并进。进入MySQL时间漩涡中看看。 1.时间类型的字段 MySQL...
    99+
    2024-04-02
  • C++构造函数的一些注意事项总结
    目录1、匿名对象2、拷贝构造函数的调用时机3、深拷贝和浅拷贝总结1、匿名对象 首先应该明确匿名对象,匿名对象是之没有对象名,调用完构造函数后即析构的对象。下面通过代码捕捉类的构造函数...
    99+
    2024-04-02
  • Python requests库参数提交的注意事项总结
    字典与json字符串区别 # python 中的字典格式,是dict类型 {'a': 'sd'} 如果声明a = {"a": "sd"},它仍是字典,不过python会默认将双引...
    99+
    2024-04-02
  • 阿里云服务器文件删除技巧及注意事项
    在使用阿里云服务器时,有时需要删除一些不需要的文件或数据,本文将介绍如何安全、有效地删除阿里云服务器上的文件,并提供一些注意事项。 1. 使用命令行工具删除文件阿里云提供了多种命令行工具来管理服务器文件,其中最常用的是SCP(Secure ...
    99+
    2023-12-29
    阿里 注意事项 服务器
  • PHP浮点数比较的注意事项与技巧
    PHP作为一种常用的服务器端脚本语言,经常会涉及到浮点数的比较操作。然而,由于浮点数的精度问题,使用不当很容易导致比较结果出现意外情况。在本文中,我们将就PHP浮点数比较的注意事项与技...
    99+
    2024-03-08
    php 比较 浮点数
  • Golang Facade模式的使用技巧与注意事项
    使用技巧:1. 理解Facade模式的目的:Facade模式旨在为外部客户端提供一个简单的接口,隐藏系统内部的复杂性。在使用Faca...
    99+
    2023-10-20
    Golang
  • Android中Glide库的使用小技巧总结
    简介在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。https://githu...
    99+
    2023-05-30
    android glide库 使用技巧
  • 阿里云服务器IP地址的填写技巧及注意事项
    本文将介绍如何正确填写阿里云服务器的IP地址,并提供一些关于IP地址使用的注意事项和建议。 一、IP地址的定义和类型IP地址是互联网协议的核心内容之一,它是唯一标识计算机网络中设备的数字地址。根据其位数的不同,IP地址可以分为IPv4和IP...
    99+
    2024-01-26
    阿里 注意事项 地址
  • 阿里云服务器ECS降配实用技巧及注意事项
    随着互联网技术的发展,越来越多的企业和个人开始使用阿里云服务器ECS。然而,随着业务的发展,ECS资源需求可能发生变化,这时就需要进行ECS降配。本文将详细讲解如何进行ECS降配,以及降配时需要注意的事项。 一、ECS降配的基本步骤登录阿里...
    99+
    2023-10-30
    阿里 实用技巧 注意事项
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作