1. Anda perlu mentakrifkan nama
apabila komponen secara rekursif Lihat nama komponen
Nama definisi Vue3
, ia akan Menjana pilihan <script setup></script>
yang sepadan secara automatik berdasarkan nama fail, seperti script
Kemudian setup
nya dijana secara automatik sebagai name
Ini mempunyai kelemahan Jika anda ingin mengubah suai Tree.vue
, anda perlu mengubah suai nama komponen Jika terdapat tempat untuk komponen, name
Perlu diubah suai bersama-sama. Tree
name
2. Buka skrip untuk mentakrifkan namaimport
<template> <div></div> </template> <script lang="ts" setup> import {ref,reactive } from 'vue' </script> <script lang='ts'> export default { name:"XXX" } </script> <style lang="less" scoped> </style>
npm i unplugin-vue-define-options -D
Gunakan
// vite.config.ts import DefineOptions from 'unplugin-vue-define-options/vite' import Vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [Vue(), DefineOptions()], })
Konfigurasivite
// tsconfig.json { "compilerOptions": { // ... "types": ["unplugin-vue-define-options/macros-global" /* ... */] } }
digunakan dengan menyusun makro tsconfig.json
untuk menambah
defineOptions
<script setup lang="ts"> defineOptions({ name: 'Foo', inheritAttrs: false, }) </script>
name
4. Pemikiran peribadi: Bukankah bagus untuk menentukan nama terus dalam skrip? inheritAttrs
<template> <div></div> </template> <script name="xiaoman" lang="ts" setup> import {ref,reactive } from 'vue' </script> <style lang="less" scoped> </style>
You Da berpendapat idea ini bagus, tetapi mempunyai beberapa kebimbangan kita perlu mentakrifkan
dan apabila kita menggunakan komponen Kebanyakan pembangun perpustakaan komponen mungkin sering menggunakan dua perkara ini, tetapi untuk 90% komponen aplikasi, ini sememangnya menjadi masalah dengan prop akan menjadi menyusahkan, dan ditambah pula dengan kerumitan pelaksanaan, saya tidak pasti ia berbaloi. name
inheritAttrs
Tetapi sudah ada pemalam yang melaksanakan fungsi ini unplugin-vue-setup-extend-plus
import type { Plugin } from 'vite' //@vue/compiler-sfc 这个插件是处理我们单文件组件的代码解析 import { compileScript, parse } from '@vue/compiler-sfc' export default function setupName(): Plugin { return { name: 'vite:plugin:vue:name', //一个 Vite 插件可以额外指定一个 `enforce` 属性 //(类似于 webpack 加载器)来调整它的应用顺序。`enforce` 的值可以是`pre` 或 `post` //加载顺序为 //Alias //带有 `enforce: 'pre'` 的用户插件 //Vite 核心插件 //没有 enforce 值的用户插件 //Vite 构建用的插件 //带有 `enforce: 'post'` 的用户插件 //Vite 后置构建插件(最小化,manifest,报告) enforce: "pre", //transform code参数就是我们写的代码比如vue代码 id就是路径例如/src/xx/xx.vue transform(code, id) { //只处理vue结尾的文件 if (/.vue$/.test(id)) { let { descriptor } = parse(code) //通过compileScript 处理script 返回result //attrs: { name: 'xm', lang: 'ts', setup: true }, //lang: 'ts', //setup: true, const result = compileScript(descriptor, { id }) //attrs 此时就是一个对象 const name = result.attrs.name const lang = result.attrs.lang const inheritAttrs = result.attrs.inheritAttrs //写入script const template = ` <script ${lang ? `lang=${lang}` : ''}> export default { ${name ? `name:"${name}",` : ''} ${inheritAttrs ? `inheritAttrs: ${inheritAttrs !== 'false'},` : ''} } </script> `; //最后拼接上这段代码 也就是我们加的script这一段 返回code code += template; // console.log(code) } return code } } }
Komponen anak Tree.vue
<template> <div v-for="item in data"> {{ item.name }} <xm v-if="item?.children?.length" :data='item?.children'></xm> </div> </template> <script name='xm' lang="ts" setup> import { ref, reactive } from 'vue' defineProps<{ data: any[] }>() </script>
<template> <TreeVue :data="data"></TreeVue> </template> <script lang="ts" setup> import TreeVue from './components/Tree.vue'; const data = [ { name: "1", children: [ { name: "1-1", children: [ { name: "1-1-1" } ] } ] } ] </script>
Atas ialah kandungan terperinci Bagaimana untuk menambah nama pada persediaan dalam Vue3. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!