尤大都说Vue3 + script setup + TS + Volar真香,你说香不香?(下)

简介: 接上文。

setup 目前存在的限制


修改选项配置需要单开一个 script


配置项的缺失,有时候我们需要更改组件选项,在setup中我们目前是无法做到的。我们需要在上方再引入一个 script,在上方写入对应的 export即可。


<script>
   export default {
       name: 'YourName',
       inheritAttrs: false,
       customOptions: {},
   } 
</script>
<script setup>
  // your code
</script>


注意:Vue 3 SFC 一般会自动从组件的文件名推断出组件的 name。在大多数情况下,不需要明确的 name 声明。唯一需要的情况是当你需要 <keep-alive> 包含或排除或直接检查组件的选项时,你需要这个名字。


与 TS 与 ESLint 不是完美融合


  1. @typescript-eslint/no-unused-vars规则不兼容,此规则含义为定义了,未进行使用。该规则其实影响不大,关闭即可。


  1. 与导入的类型声明不兼容,当你通过解构的方式去导入类型,setup sugar 会进行自动导出。这时候,你就会收到 TS 的一条报错:此为类型,但被当作值使用。解决办法:类型导出使用export default导出或者引入时使用import * as xx来进行引入。


感谢评论区补充:import type { test } from "./test";如此书写,也是可以解决的。


关于这一点,也许你会想着在上方写一个 script 进行导入,但是这是不行的。在上方 script 导入的东西,也会被自动导出。详情见:github.com/vuejs/vue-n…[7]


必须安装新的插件


集成开发环境需要为这个新的 <script setup> 模型提供专门的处理,以便提供模板表达式类型检查 / 道具验证等。安装Volar也是为了这个目的。


vue3 中如何实现国际化


  1. 下载最新的vue-i18n,当前版本"vue-i18n": "^9.1.7"


  1. src 下创建文件夹locales,创建好对应语言文案(这里最好使用 json)。


import en from "./en.json";
import zhHans from "./zh-cn.json";
import zhHant from "./zh-hk.json";
import { createI18n } from "vue-i18n";
import { judgeLang } from "@/utils/url";
const messages = {
   en: en,
   "zh-hans": zhHans,
   "zh-hant": zhHant,
};
const i18n = createI18n({
   locale: judgeLang(),
   messages,
});
export default i18n;


  1. main.ts中引入i18n


import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import i18n from "@/locales/index";
createApp(App).use(store).use(router).use(i18n).mount("#app");


  1. 创建一个i18n hook


import { provide, inject } from "vue";
import { useI18n } from "vue-i18n";
export function useProvideI18n(): void {
   const { t } = useI18n();
   // 注入翻译函数
   provide("t", t);
}
export function useInjectI18n(): (text: string) => string {
  const t = inject("t") as (text: string) => string;
  return t;
}


  1. app.vue,进行注入。随后,便可在各处进行接收使用。


  1. 下载 i18n Ally,可查看实时翻译(强烈推荐)。


vue3.2新增有意思的东西


v-memo(Vue3.2 新增)


记录指令下的模板树。该指令期望一个数组,如果数组内的值,都没有发生更新,那么指令下的模板树也不会发生更新。


<div v-memo="[valueA, valueB]">
  ...
</div>


当组件重新渲染时,如果valueAvalueB保持不变,<div>则将跳过此组件及其子组件的所有更新。实际上,即使是 Virtual DOM VNode 创建也将被跳过,因为可以重复使用子树的记忆副本。


官网提到v-memo仅用于性能关键场景中的微优化,一般使用到的地方应该是渲染大型v-for列表(其中length > 1000)。


<div v-for="item in list" :key="item.id" v-memo="[item.id === selected]">
  <p>ID: {{ item.id }} - selected: {{ item.id === selected }}</p>
  <p>...more child nodes</p>
</div>


v-bindin<style>(实验性语法)


支持在单文件组件样式中使用组件状态驱动的CSS变量。其实,关于这个提案已经持续很久了(换了写法而已),本质上是利用CSS var() 函数


<template>
  <div class="text">hello</div>
</template>
<script>
  export default {
    data() {
      return {
        color: 'red',
        font: {
          size: '2em',
        },
      }
    },
  }
</script>
<style>
  .text {
    color: v-bind(color);
    /* 表达式需用引号括起来 */
    font-size: v-bind('font.size');
  }
</style>


你可能会遇到的问题


移动端调试工具 vConsole 发生栈溢出


一般移动端调试都是使用vConsole轻量好用,但是目前对 Vue3 兼容性不好,使用到一定时间,会出现栈溢出。这里推荐另外一个调试工具erudaeruda目前使用起来并没有大的问题,但是这个插件特别大,500 多 kb 是对于移动端是无法忍受的,即便压缩后也有 100 多 kb。这里我们只要根据环境判断,利用 script 动态插入就好了。


export default function debugInit(): void {
  const script = document.createElement("script");
  script.type = "text/javascript";
  script.src = "//cdn.bootcdn.net/ajax/libs/eruda/2.3.3/eruda.js";
  document.getElementsByTagName("head")[0].appendChild(script);
  script.onload = function () {
    window.eruda.init();
  };
}


13c4662392fbe1844cdcb3d75e7bcd1f.jpg


慎用无根标签的组件


目前 vue3 中我们已经不需要强制组件有一个根标签了,但是有些情况下,表现并不太好。


例如:transition组件目前和此种写法偶发出现问题。


你在Vue3的使用中,有遇到什么坑或者经验之谈吗?可以在评论区留下你宝贵的建议哦~


写在最后


我是零一,如果我的文章对你有帮助,请点个 👍🏻 支持我一下

相关文章
|
29天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
129 64
|
3天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
22 3
|
29天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
33 8
|
28天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
31 1
|
28天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
38 1
|
1月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
8天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
43 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
30 1
|
1月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
38 1
vue学习第四章

热门文章

最新文章