• [技术干货] vue3条件渲染
    在 Vue 3 中,条件渲染是一种根据应用状态动态地显示或隐藏元素的技术。Vue 提供了多种指令和方法来实现条件渲染,包括 v-if、v-else-if、v-else、v-show 以及组合 API 中的条件逻辑。以下是对 Vue 3 中条件渲染的详细解释:1. v-if、v-else-if、v-elsev-if:用于根据表达式的真假来决定是否渲染元素。<template> <div v-if="isVisible">This is visible if isVisible is true</div> </template> <script>export default { data() { return { isVisible: true }; } }; </script> v-else-if:用于在 v-if 链中添加多个条件。<template> <div v-if="status === 'success'">Success!</div> <div v-else-if="status === 'pending'">Loading...</div> <div v-else-if="status === 'error'">Error occurred!</div> </template> <script>export default { data() { return { status: 'pending' }; } }; </script> v-else:用于在 v-if 或 v-else-if 链的末尾添加一个默认条件。<template> <div v-if="status === 'success'">Success!</div> <div v-else-if="status === 'pending'">Loading...</div> <div v-else>Something went wrong!</div> </template> 2. v-show用法:v-show 指令用于根据表达式的真假来决定是否显示元素,而不是渲染。元素始终存在于 DOM 中,只是通过 CSS 的 display 属性来控制显示。<template> <div v-show="isVisible">This is visible if isVisible is true</div> </template> <script>export default { data() { return { isVisible: true }; } }; </script> 区别:与 v-if 不同的是,v-show 不会移除元素,只是简单地切换元素的显示状态。这在需要频繁切换显示状态时性能更好。3. 组合 API 中的条件渲染使用 JavaScript 逻辑:在组合 API 中,可以使用 JavaScript 的条件逻辑来控制渲染。<template> <div v-if="shouldRender">This is rendered based on JavaScript logic</div> </template> <script>import { ref, computed } from 'vue'; export default { setup() { const isActive = ref(true); const shouldRender = computed(() => isActive.value && someOtherCondition()); function someOtherCondition() { // 自定义条件逻辑 return true; } return { shouldRender }; } }; </script> 4. 使用 <template> 进行条件渲染<template> 标签:<template> 标签本身不会渲染到 DOM 中,但可以用来包裹多个元素,结合条件渲染指令一起使用。<template> <div v-if="condition"> <template v-if="anotherCondition"> <p>Condition and anotherCondition are both true.</p> </template> <template v-else> <p>Condition is true, but anotherCondition is false.</p> </template> </div> </template> 5. v-if 与 v-for 优先级优先级:当 v-if 与 v-for 一起使用时,v-for 的优先级比 v-if 高。这意味着即使 v-if 返回 false,v-for 仍然会遍历整个列表。为了避免这种情况,通常建议在同一个元素上避免同时使用 v-if 和 v-for。<!-- 不推荐 --> <div v-for="item in items" v-if="item.isVisible" :key="item.id"> {{ item.name }} </div> <!-- 推荐 --> <template v-for="item in items" :key="item.id"> <div v-if="item.isVisible"> {{ item.name }} </div> </template> 总结v-if、v-else-if、v-else:用于根据条件动态地渲染元素。v-show:用于根据条件动态地显示或隐藏元素,而不移除它们。组合 API:利用 JavaScript 逻辑在 setup 函数中实现更复杂的条件渲染。<template> 标签:用于包裹多个元素,结合条件渲染指令使用。优先级:注意 v-if 和 v-for 的优先级问题,避免潜在的性能陷阱。通过这些工具和方法,Vue 3 提供了灵活且强大的条件渲染功能,帮助开发者根据应用状态动态地控制内容的显示和隐藏。
  • [技术干货] Vue3类与样式的绑定
    在 Vue 3 中,类与样式的绑定是动态地控制元素样式和类名的强大工具。Vue 提供了多种语法来实现这一功能,包括对象语法和数组语法。以下是对 Vue 3 中类与样式绑定的详细解释:类绑定1. 对象语法用法:通过对象语法,可以将一个对象传递给 :class 指令,对象的键是类名,值是布尔值。如果值为 true,则该类名会被添加到元素上。<template> <div :class="{ active: isActive, 'text-danger': hasError }">Hello Vue 3</div> </template> <script>export default { data() { return { isActive: true, hasError: false }; } }; </script> 在上述例子中,如果 isActive 为 true,则 active 类会被添加到 div 元素上;如果 hasError 为 true,则 text-danger 类会被添加。动态绑定对象:也可以直接绑定一个对象或计算属性到 :class。<template> <div :class="classObject">Hello Vue 3</div> </template> <script>export default { data() { return { isActive: true, hasError: false }; }, computed: { classObject() { return { active: this.isActive, 'text-danger': this.hasError }; } } }; </script> 2. 数组语法用法:通过数组语法,可以将一个类名数组传递给 :class 指令,Vue 会将数组中的每个类名都添加到元素上。<template> <div :class="[activeClass, errorClass]">Hello Vue 3</div> </template> <script>export default { data() { return { activeClass: 'active', errorClass: 'text-danger' }; } }; </script> 条件渲染:可以在数组中使用三元表达式来有条件地渲染类名。<template> <div :class="[isActive ? activeClass : '', errorClass]">Hello Vue 3</div> </template> <script>export default { data() { return { isActive: true, activeClass: 'active', errorClass: 'text-danger' }; } }; </script> 嵌套对象:也可以在数组中嵌套对象,以实现更复杂的条件渲染。<template> <div :class="[{ active: isActive }, errorClass]">Hello Vue 3</div> </template> <script>export default { data() { return { isActive: true, errorClass: 'text-danger' }; } }; </script> 样式绑定1. 对象语法用法:通过对象语法,可以将一个对象传递给 :style 指令,对象的键是 CSS 属性名(使用 camelCase 或 kebab-case),值是对应的样式值。<template> <div :style="{ color: activeColor, fontSize: fontSize + 'px' }">Hello Vue 3</div> </template> <script>export default { data() { return { activeColor: 'red', fontSize: 16 }; } }; </script> 动态绑定对象:也可以直接绑定一个对象或计算属性到 :style。<template> <div :style="styleObject">Hello Vue 3</div> </template> <script>export default { data() { return { activeColor: 'red', fontSize: 16 }; }, computed: { styleObject() { return { color: this.activeColor, fontSize: this.fontSize + 'px' }; } } }; </script> 2. 数组语法用法:通过数组语法,可以将多个样式对象传递给 :style 指令,Vue 会将这些样式对象合并后应用到元素上。<template> <div :style="[baseStyles, overridingStyles]">Hello Vue 3</div> </template> <script>export default { data() { return { baseStyles: { color: 'red', fontSize: '16px' }, overridingStyles: { backgroundColor: 'lightgray' } }; } }; </script> 优先级:如果多个样式对象有相同的属性,则后面的样式对象会覆盖前面的样式对象。总结类绑定:使用对象语法或数组语法动态地添加或移除类名。样式绑定:使用对象语法或数组语法动态地设置元素的样式。计算属性:在计算属性中返回对象或数组,以实现更复杂的逻辑和更好的代码组织。通过这些绑定方式,Vue 3 提供了灵活且强大的工具,帮助开发者根据应用状态动态地控制元素的样式和类名。
  • vue3计算属性
    在 Vue 3 中,计算属性是一种基于其他属性值动态计算出的属性,其计算结果会被缓存,只有当依赖的属性发生变化时,相关计算才会重新执行。这使得计算属性非常适合处理复杂逻辑或是重复使用的逻辑,而无需在模板中编写过多的代码。定义计算属性在 Vue 3 组件中,计算属性是在 computed 选项中定义的。下面是一个简单的例子:<template> <div> <p>Original message: {{ message }}</p> <p>Reversed message: {{ reversedMessage }}</p> </div> </template> <script>export default { data() { return { message: 'Hello Vue 3' } }, computed: { // 计算属性 reversedMessage() { // 计算属性的值是基于 `message` 的 return this.message.split('').reverse().join(''); } } } </script> 计算属性的特点缓存:计算属性会基于其依赖的数据进行缓存,只有当依赖的数据发生变化时才会重新计算。这意味着,如果 message 没有变化,多次访问 reversedMessage 不会触发新的计算。声明式:计算属性的使用是声明式的,你只需要定义它们之间的关系,Vue 会负责管理和更新。可读:计算属性一般用于读取数据,但它们也可以是可写的(即可以设置 getter 和 setter)。可写计算属性如果你需要计算属性既可以读取又可以写入,你可以使用 getter 和 setter。如下例所示:<template> <div> <p>Full name: {{ fullName }}</p> <input v-model="fullName" placeholder="Enter full name"> </div> </template> <script>export default { data() { return { firstName: 'John', lastName: 'Doe' } }, computed: { fullName: { // getter get() { return `${this.firstName} ${this.lastName}`; }, // setter set(newValue) { const names = newValue.split(' '); this.firstName = names[0]; this.lastName = names[names.length - 1]; } } } } </script> 在这个例子中,fullName 是一个可写的计算属性。当 fullName 被修改时,setter 会被调用,并更新 firstName 和 lastName。计算属性 vs 方法计算属性:适用于基于其他数据计算数据的场景,有缓存机制,适合复杂计算。方法:用于执行操作或返回计算结果,但每次调用都会执行函数,没有缓存。选择使用计算属性还是方法,主要取决于你是否需要缓存结果。对于需要频繁访问且计算开销较大的数据,计算属性是更好的选择。
  • [技术干货] vue3模板语法
    Vue 3 中的模板语法是用于将数据绑定到 DOM 的一种声明式语法。它允许你在 HTML 中嵌入 Vue 的特定指令和表达式,从而实现动态内容的展示。以下是一些常用的 Vue 3 模板语法示例和概念:插值文本插值:使用双大括号 {{ }} 来绑定数据。<template> <div>{{ message }}</div> </template> <script>export default { data() { return { message: 'Hello, Vue 3!' } } } </script> HTML 插值:使用 v-html 指令来插入 HTML 内容。<template> <div v-html="rawHtml"></div> </template> <script>export default { data() { return { rawHtml: '<span style="color: red;">This is red text.</span>' } } } </script> 指令Vue 提供了一组指令用于执行 DOM 操作。指令以 v- 开头。v-bind:绑定元素属性。<template> <img v-bind:src="imageSrc" alt="Image"> </template> <script>export default { data() { return { imageSrc: 'https://example.com/image.png' } } } </script> 简写::src="imageSrc"v-on:绑定事件监听器。<template> <button v-on:click="handleClick">Click me</button> </template> <script>export default { methods: { handleClick() { alert('Button clicked!'); } } } </script> 简写:@click="handleClick"v-model:双向绑定表单元素。<template> <input v-model="inputValue" placeholder="Type something..."> <p>You typed: {{ inputValue }}</p> </template> <script>export default { data() { return { inputValue: '' } } } </script> v-if / v-else-if / v-else:条件渲染。<template> <div v-if="status === 'success'">Success!</div> <div v-else-if="status === 'pending'">Loading...</div> <div v-else>Error!</div> </template> <script>export default { data() { return { status: 'success' } } } </script> v-for:列表渲染。<template> <ul> <li v-for="(item, index) in items" :key="index">{{ item }}</li> </ul> </template> <script>export default { data() { return { items: ['Apple', 'Banana', 'Cherry'] } } } </script> 缩写v-bind 缩写为 :<a :href="url">Link</a> v-on 缩写为 @<button @click="doSomething">Click me</button> 计算属性和侦听器计算属性:用于声明式地计算属性值。computed: { reversedMessage() { return this.message.split('').reverse().join(''); } } 侦听器(Watchers):用于对数据变化做出反应。watch: { message(newValue, oldValue) { console.log(`Message changed from ${oldValue} to ${newValue}`); } } 这些基本语法构成了 Vue 3 模板语言的基础,它们能够让开发者把 JavaScript 对象的状态直接映射为用户界面。这种方式大大简化了动态内容更新的逻辑。
  • [技术干货] Nuxt Kit 组件管理:注册与自动导入
    组件的重要性在 Nuxt.js 中,组件是构建用户界面的基本单元。它们是可重用的 Vue 实例,能够帮助开发者创建复杂的用户界面并提升应用的可维护性。Nuxt Kit 提供了一系列工具,以便于在项目中高效地注册和导入这些组件。组件导入的默认行为默认情况下,Nuxt 会自动导入 components 目录下的所有 Vue 组件。这意味着你可以直接在页面或布局文件中使用这些组件,而无需手动导入它们。这种自动导入的方式减少了代码的冗余和手动管理的复杂度。addComponentsDir 方法详解功能概述addComponentsDir 允许你注册一个新的目录,Nuxt 会自动扫描并导入该目录下的所有组件。它为你提供更多灵活性,以支持项目中特殊的组件需求,如使用非标准目录结构或按需加载组件。函数签名async function addComponentsDir(dir: ComponentsDir): voidComponentsDir 接口详解该接口描述了配置的结构,以下是各个属性的详细信息:path (必填):类型: string描述: 要扫描的组件目录路径。可使用 Nuxt 别名(如 ~ 或 @)或相对路径。pattern (可选):类型: string | string[]描述: 指定匹配组件文件的模式。例如,'**/*.vue' 只匹配 .vue 文件。ignore (可选):类型: string[]描述: 指定忽略匹配的模式。例如,用于排除特定的文件或目录。prefix (可选):类型: string描述: 为匹配的组件名添加指定前缀。pathPrefix (可选):类型: boolean描述: 是否将组件路径添加为组件名的前缀。enabled (可选):类型: boolean描述: 如果该选项为 true,将忽略对此目录的扫描。prefetch 和 preload (可选):类型: boolean描述: 用于配置组件在生产环境中的预加载行为,从而优化加载性能。isAsync (可选):类型: boolean描述: 表示组件是否应异步加载,适用于大规模组件库的场景。extendComponent (可选):类型: (component: Component) => Promise<Component | void> | (Component | void)描述: 对每个找到的组件进行扩展,允许你在注册前对组件对象进行修改。global (可选):类型: boolean描述: 默认为 false,如果设置为 true,组件将全局可用。island (可选):类型: boolean描述: 设置为 true 将注册组件为 islands。watch (可选):类型: boolean描述: 若设置为 true,将监视该目录的变化。extensions (可选):类型: string[]描述: 指定要处理的文件扩展名。例如,['vue', 'js']。transpile (可选):类型: 'auto' | boolean描述: 用于指定是否对路径中的文件进行转译。使用示例import { defineNuxtModule, addComponentsDir } from '@nuxt/kit'; export default defineNuxtModule({ setup() { addComponentsDir({ path: '~/custom-components', pattern: '**/*.vue', prefix: 'My', global: true, watch: true, }); }, });在此示例中:我们注册了名为 custom-components 的目录。使用模式 **/*.vue 来匹配其中的所有 Vue 文件。所有组件名都将添加前缀 My。该目录的组件将全局可用,并启用了更改监视。addComponent 方法详解功能概述addComponent 方法用于注册一个单独的组件,让它在整个 Nuxt 应用中自动导入。这在处理少数重要组件时尤其有用。函数签名async function addComponent(options: AddComponentOptions): voidAddComponentOptions 接口详解该接口定义了注册组件所需的选项,以下是各个属性的详细信息:name (必填):类型: string描述: 组件的名称,推荐使用 PascalCase 格式。filePath (必填):类型: string描述: 组件的路径,必须为绝对路径或相对路径。pascalName (可选):类型: string描述: PascalCase 的组件名称。未提供时自动生成。kebabName (可选):类型: string描述: KebabCase 的组件名称。未提供时自动生成。export (可选):类型: string描述: 指定组件的导出形式,默认为 default。shortPath (可选):类型: string描述: 组件的短路径,未提供时自动生成。chunkName (可选):类型: string描述: 组件的代码块名称,默认为 'components/' + kebabName。prefetch 和 preload (可选):类型: boolean描述: 用于生产环境中配置组件的预取和预加载行为。global (可选):类型: boolean描述: 设置为 true 将使组件全局可用。island (可选):类型: boolean描述: 设置为 true 注册组件为 islands。mode (可选):类型: 'client' | 'server' | 'all'描述: 指定组件的渲染模式,默认为 all。priority (可选):类型: number描述: 设置组件的优先级,越高优先级越高。使用示例import { defineNuxtModule, addComponent } from '@nuxt/kit'; export default defineNuxtModule({ setup() { addComponent({ name: 'MyButton', filePath: '~/components/MyButton.vue', global: true, }); }, });在此示例中,我们注册了名为 MyButton 的组件并设置其为全局可用。结论通过 addComponentsDir 和 addComponent 方法,Nuxt Kit 为组件的注册和导入提供了灵活高效的解决方案。无论你是要批量导入组件,还是单独处理特定组件,这些工具都能够满足你的需求。使用这些方法可以显著提升开发效率、减少管理复杂性。转载自https://www.cnblogs.com/Amd794/p/18415204
  • [技术干货] Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数
    Nuxt Kit 自动导入功能详细指南Nuxt Kit 提供了一系列工具,使开发者能够使用自动导入功能。这些功能使您可以在开发过程中更方便地使用来自不同模块的帮助函数和组合式函数,而不必手动导入每个文件。目录结构和自动导入Nuxt 的自动导入功能基于项目的目录结构,每个 Nuxt 应用程序都可以根据其结构自动导入组合式函数和插件。通过 Nuxt Kit,您可以添加自己的工具和函数,使其在全局范围内可用,极大提升开发效率。1. 添加导入: addImports1.1 功能描述addImports 函数允许您添加单个或多个导入,使它们在 Nuxt 应用程序中可用。使用该功能,您可以无缝将库或模块中的函数引入到您的组件中。1.2 函数签名function addImports(imports: Import | Import[]): void1.3 Import 接口Import 接口有以下属性:from(必填): 需要导入的模块名,必须为字符串。priority(可选): 导入的优先级,默认为 1。若存在多个同名导入,将根据此属性决定优先级。disabled(可选): 布尔类型,表示该导入是否被禁用。meta(可选): 附加信息,通常用于提供文档链接或描述。description(可选): 导入的描述信息。docsUrl(可选): 指向相关文档的 URL。type(可选): 布尔类型,指示该导入是否为类型导入。typeFrom(可选): 指定用于生成类型声明的来源。name(必填): 被检测的导入名称。as(可选): 导入的别名。1.4 示例代码下面的示例展示了如何使用 addImports 添加多个导入函数:import { defineNuxtModule, addImports } from '@nuxt/kit'; export default defineNuxtModule({ setup(options, nuxt) { const names = [ "useStoryblok", "useStoryblokApi", "useStoryblokBridge", "renderRichText", "RichTextSchema" ]; names.forEach((name) => addImports({ name, from: "@storyblok/vue", as: name }) ); } });1.5 代码解析在这个示例中,我们定义了一个 Nuxt 模块,并通过循环将多个函数(从 @storyblok/vue 模块获取)逐个添加到 Nuxt 中。每个函数都有一个对应的别名,可以直接在 Vue 组件中使用,而无需手动导入。2. 添加目录中的导入: addImportsDir2.1 功能描述addImportsDir 函数用于自动导入指定目录中的所有文件。它能够遍历目录并自动处理所有导入项,使其在 Nuxt 应用程序中可用。2.2 函数签名function addImportsDir(dirs: string | string[], options?: { prepend?: boolean }): void2.3 参数说明dirs(必填): 可以是字符串或字符串数组,指定要从中导入的目录路径。options(可选): 传递给导入的选项。prepend(可选): 布尔类型,若设置为 true,则导入将置于顶部。2.4 示例代码以下代码示例展示了如何使用 addImportsDir 添加一个目录下的所有组合式函数:import { defineNuxtModule, addImportsDir, createResolver } from '@nuxt/kit'; export default defineNuxtModule({ setup(options, nuxt) { const resolver = createResolver(import.meta.url); addImportsDir(resolver.resolve('./runtime/composables')); } });2.5 代码解析在这个示例中,createResolver 用于构建一个解析器,该解析器动态解析当前模块的位置。addImportsDir 命令将在指定的 ./runtime/composables 目录下自动查找并添加所有组合式函数。这使得所有组合式函数在 Nuxt 应用中可用,开发者无需分别手动导入每个函数。3. 添加源中的导入: addImportsSources3.1 功能描述addImportsSources 函数使您能够从特定源添加一组导入,无需手动指定每个导入。3.2 函数签名function addImportsSources(importSources: ImportSource | ImportSource[]): void3.3 ImportSource 接口ImportSource 接口的属性包括:imports(必填): 需要导入的名称或对象。from(必填): 需要从中导入的模块名。priority(可选): 导入的优先级,默认为 1。disabled(可选): 布尔值,指示是否禁用该导入。meta(可选): 附加的元数据。3.4 示例代码以下代码展示如何添加来自一个模块的多个导入:import { defineNuxtModule, addImportsSources } from '@nuxt/kit'; export default defineNuxtModule({ setup() { addImportsSources({ from: 'h3', imports: [ 'defineEventHandler', 'getQuery', 'getRouterParams', 'readBody', 'sendRedirect' ] as Array<keyof typeof import('h3')>, }); } });3.5 代码解析在这个示例中,我们从 h3 模块添加五个函数作为自动导入。这使得您在应用程序中可以直接使用这些方法,而无需手动导入每个使用的函数。4. 整体工作流程创建 Nuxt 模块: 在 Nuxt 项目中创建一个模块来定义和管理您的导入。调用自动导入工具: 使用 addImports、addImportsDir 或 addImportsSources 函数,以必要的配置添加所需的导入。使用导入: 在 Vue 组件中,直接调用导入的函数,无需显式导入语句。5. 常见问题5.1 如何添加多个导入?您可以通过 addImports 函数的数组参数来一次性添加多个导入。5.2 导入的优先级如何工作?在使用 priority 属性时,若有多个同名导入,将选择优先级最高的进行使用。5.3 可以导入类型定义吗?通过设置 type 属性为 true,您可以将导入标记为类型导入。总结通过使用 Nuxt Kit 的自动导入功能,您可以更高效地管理和使用公共函数、组合式函数和 Vue API。无论是单个导入、目录导入还是从第三方模块导入,您都可以通过简单的 API 调用轻松实现。转载自https://www.cnblogs.com/Amd794/p/18413849
  • [技术干货] 使用 Nuxt Kit 检查模块与 Nuxt 版本兼容性
    在开发 Nuxt 模块时,确保与不同 Nuxt 版本的兼容性是至关重要的。Nuxt Kit 提供了一组功能强大的工具,帮助您轻松检查模块与 Nuxt 3、带桥的 Nuxt 2 和不带桥的 Nuxt 2 的兼容性。1. 检查 Nuxt 兼容性1.1 checkNuxtCompatibility该函数用于检查当前 Nuxt 版本是否满足特定的约束条件。若不满足,函数将返回一组包含错误消息的数组。函数签名async function checkNuxtCompatibility( constraints: NuxtCompatibility, nuxt?: Nuxt ): Promise<NuxtCompatibilityIssues>;constraints 参数nuxt(可选): 一个字符串,使用 semver 格式来定义 Nuxt 版本(例如:>=2.15.0 <3.0.0)。bridge(可选): 一个布尔值,检查当前 Nuxt 版本是否支持桥接功能。示例代码import { checkNuxtCompatibility } from '@nuxt/kit' async function verifyCompatibility() { const issues = await checkNuxtCompatibility({ nuxt: '>=2.15.0 <3.0.0', bridge: true }); if (issues.length > 0) { console.error('兼容性问题:', issues); } else { console.log('兼容性检查通过!'); } } verifyCompatibility();解释在这个示例中,我们使用 checkNuxtCompatibility 检查当前 Nuxt 版本是否满足我们的约束条件。如果有任何兼容性问题,它们将被打印到控制台。2. 断言 Nuxt 兼容性2.1 assertNuxtCompatibility该函数用于断言当前 Nuxt 版本是否符合条件。如果不满足,将抛出一个包含问题列表的错误。函数签名async function assertNuxtCompatibility( constraints: NuxtCompatibility, nuxt?: Nuxt ): Promise<true>;示例代码import { assertNuxtCompatibility } from '@nuxt/kit' async function assertCompatibility() { try { await assertNuxtCompatibility({ nuxt: '>=2.15.0 <3.0.0', bridge: true }); console.log('兼容性验证通过!'); } catch (error) { console.error('兼容性验证失败:', error); } } assertCompatibility();解释在这个示例中,我们使用 assertNuxtCompatibility 来断言当前 Nuxt 版本的兼容性。如果不满足条件,将抛出异常并打印详细问题。3. 检查 Nuxt 兼容性状态3.1 hasNuxtCompatibility该函数检查当前 Nuxt 版本是否满足给定的约束条件。它返回一个布尔值,指示所有条件是否满足。函数签名async function hasNuxtCompatibility( constraints: NuxtCompatibility, nuxt?: Nuxt ): Promise<boolean>;示例代码import { hasNuxtCompatibility } from '@nuxt/kit' async function checkHasCompatibility() { const isCompatible = await hasNuxtCompatibility({ nuxt: '>=2.15.0 <3.0.0' }); if (isCompatible) { console.log('所有兼容性条件均满足!'); } else { console.log('存在不满足的兼容性条件。'); } } checkHasCompatibility();解释在这个示例中,我们使用 hasNuxtCompatibility 来简单检查当前 Nuxt 版本是否符合所有设定的条件。4. 检查 Nuxt 版本Nuxt Kit 还提供了一些简单的函数来帮助检查特定的 Nuxt 版本。4.1 isNuxt2检查当前 Nuxt 版本是否为 2.x。function isNuxt2(nuxt?: Nuxt): boolean;示例代码import { isNuxt2 } from '@nuxt/kit' if (isNuxt2()) { console.log('当前 Nuxt 版本为 2.x'); }4.2 isNuxt3检查当前 Nuxt 版本是否为 3.x。function isNuxt3(nuxt?: Nuxt): boolean;示例代码import { isNuxt3 } from '@nuxt/kit' if (isNuxt3()) { console.log('当前 Nuxt 版本为 3.x'); }4.3 getNuxtVersion获取当前 Nuxt 版本。function getNuxtVersion(nuxt?: Nuxt): string;示例代码import { getNuxtVersion } from '@nuxt/kit' const version = getNuxtVersion(); console.log(`当前 Nuxt 版本为:${version}`);总结通过 Nuxt Kit 提供的兼容性检查工具,您可以轻松地确保您的模块与不同版本的 Nuxt 兼容。这将有助于您在开发过程中避免潜在的兼容性问题,从而提升您的开发效率。转载自https://www.cnblogs.com/Amd794/p/18411967
  • [技术干货] Nuxt Kit 的使用指南:从加载到构建
    Nuxt Kit 为开发人员提供了一组实用工具,以编程方式使用 Nuxt。这在构建 CLI 工具、测试工具或自定义应用时非常有用。什么是 Nuxt Kit?Nuxt Kit 是 Nuxt 的一个组件,提供了一些函数来以编程的方式加载和使用 Nuxt。这意味着您可以在更复杂的环境中,例如命令行工具或自动化脚本中,与Nuxt 进行交互。1. 使用 loadNuxt 加载 NuxtloadNuxt 函数用于以编程方式加载 Nuxt 配置。它将返回一个带有 Nuxt 实例的 Promise。函数签名async function loadNuxt(loadOptions?: LoadNuxtOptions): Promise<Nuxt>loadOptions 参数dev(可选): Boolean,是否以开发模式加载(默认:false)。ready(可选): Boolean,是否在调用后等待 Nuxt 准备就绪(默认:true)。rootDir(可选): String,Nuxt 项目的根目录(建议使用 cwd 替代)。config(可选): 覆盖 Nuxt 配置项(建议使用 overrides 替代)。示例代码下面是一个简单示例,展示如何使用 loadNuxt 加载 Nuxt。// loadNuxtExample.js import {loadNuxt} from '@nuxt/kit' async function startNuxt() { const nuxt = await loadNuxt({ dev: true, ready: false, }) await nuxt.ready() // 确保 Nuxt 准备完毕 console.log('Nuxt 已成功加载!') } startNuxt()解释在这个示例中,我们加载了 Nuxt,并设置了开发模式。然后我们调用 nuxt.ready(),以确认 Nuxt 已准备好使用。2. 使用 buildNuxt 进行构建在加载 Nuxt 之后,您可以使用 buildNuxt 函数以编程方式构建项目。函数签名async function buildNuxt(nuxt: Nuxt): Promise<any>参数nuxt(必填): 需要构建的 Nuxt 实例。示例代码import {loadNuxt, buildNuxt} from '@nuxt/kit' async function buildMyNuxtApp() { const nuxt = await loadNuxt({dev: false}) await buildNuxt(nuxt) // 构建 Nuxt 应用 console.log('Nuxt 应用已成功构建!') } buildMyNuxtApp()解释在此示例中,我们使用 loadNuxt 加载 Nuxt 并设置生产模式(非开发模式)。然后我们调用 buildNuxt 以实际构建 Nuxt 应用。3. 使用 loadNuxtConfig 加载配置如果您只需加载 Nuxt 配置,可以使用 loadNuxtConfig。函数签名async function loadNuxtConfig(options: LoadNuxtConfigOptions): Promise<NuxtOptions>示例代码import {loadNuxtConfig} from '@nuxt/kit' async function loadConfig() { const config = await loadNuxtConfig({ // 在这里添加您需要的配置选项 }) console.log('Nuxt 配置已加载:', config) } loadConfig()解释这段代码使用 loadNuxtConfig 加载 Nuxt 配置并打印出来,帮助您了解当前的设置。4. 生成 TypeScript 配置如果您正在使用 TypeScript 开发,您可以使用 writeTypes 函数生成 tsconfig.json。函数签名function writeTypes(nuxt?: Nuxt): void示例代码import {loadNuxt, writeTypes} from '@nuxt/kit' async function generateTypes() { const nuxt = await loadNuxt({dev: false}) writeTypes(nuxt) // 生成类型定义 console.log('tsconfig.json 已生成!') } generateTypes()解释在这个示例中,我们加载 Nuxt 并生成 TypeScript 配置文件,这有助于为您的 Nuxt 应用提供类型支持。总结使用 Nuxt Kit 的编程式接口,您可以以灵活和强大的方式与 Nuxt 进行交互。从加载配置到构建应用,您可以通过简单的函数调用实现复杂的开发流程。转载自https://www.cnblogs.com/Amd794/p/18409946
  • [技术干货] Nuxt Kit 的使用指南:模块创建与管理
    在 Nuxt 3 的开发中,模块是构建应用的重要组件。它们允许我们扩展 Nuxt 的功能,从而更高效、更灵活地完成开发任务。为此,Nuxt Kit 提供了一些实用工具来帮助我们创建和管理这些模块。什么是 Nuxt Kit?Nuxt Kit 是一组用于构建和管理 Nuxt 模块的工具。通过这些工具,你可以创建自己的模块,重用现有的模块,或者在你的项目中以编程方式安装其他模块。1. 使用 defineNuxtModule 创建模块defineNuxtModule 是定义新模块的主要函数。它可以自动处理一些常见的任务,比如合并默认选项、设置模块的钩子以及调用自定义的设置函数等。函数签名function defineNuxtModule<OptionsT extends ModuleOptions>(definition: ModuleDefinition<OptionsT> | NuxtModule<OptionsT>): NuxtModule<OptionsT>参数说明definition: 模块定义对象或函数,是必需的。meta(可选): 模块的元数据,比如名称和版本号。defaults(可选): 模块的默认选项。schema(可选): 模块选项的模式。hooks(可选): 模块所需的钩子。setup(可选): 模块的设置函数。示例下面是一个简单的示例,演示如何使用 defineNuxtModule 创建一个名为 my-module 的模块。// my-module.js import { defineNuxtModule } from '@nuxt/kit' export default defineNuxtModule({ meta: { name: 'my-module', configKey: 'myModule' }, defaults: { test: 123 }, setup(options, nuxt) { nuxt.hook('modules:done', () => { console.log('我的模块已准备就绪,当前测试选项为:', options.test) }) } })解释定义模块: defineNuxtModule 函数被用来定义一个模块。元数据: meta 中定义了模块的名称和配置键。默认选项: 通过 defaults 来设定模块默认选项。设置钩子: 在 setup 函数中注册钩子,当模块完成时会打印测试选项。2. 使用 installModule 安装模块当你的模块依赖于其他模块时,你可以使用 installModule 函数以编程方式安装这些模块。函数签名async function installModule(moduleToInstall: string | NuxtModule, inlineOptions?: any, nuxt?: Nuxt)参数说明moduleToInstall: 要安装的模块,可以是模块名称的字符串或模块对象。inlineOptions: 模块选项的对象,这些选项会被传递给模块的 setup 函数。nuxt: Nuxt 实例,默认会被自动获取。示例下面是一个示例,演示如何在你的模块中使用 installModule 安装 @nuxtjs/fontaine 模块。// my-font-module.js import { defineNuxtModule, installModule } from '@nuxt/kit' export default defineNuxtModule({ async setup(options, nuxt) { // 将以 Roboto 字体和 Impact 替代字体安装 @nuxtjs/fontaine await installModule('@nuxtjs/fontaine', { // 模块配置 fonts: [ { family: 'Roboto', fallbacks: ['Impact'], fallbackName: 'fallback-a', } ] }) } })解释安装模块: 在 setup 函数中调用 installModule 函数。模块配置: 传递一个对象,包含要安装的字体及其后备字体。总结通过使用 Nuxt Kit 提供的 defineNuxtModule 和 installModule 函数,你可以方便地创建和管理 Nuxt 3 模块。这些模块可以帮助你更有效地组织代码,重用已有的功能,提升开发效率。无论你是想创建一个小工具,还是想开发一个强大的功能模块,Nuxt Kit 都为你提供了强大的支持。转载自https://www.cnblogs.com/Amd794/p/18408097
  • [技术干货] 使用 nuxi upgrade 升级现有nuxt项目版本
    如果你正在使用 Nuxt 3 进行开发,及时升级至最新版本可以让你体验到最新的功能和性能提升。什么是 nuxi?nuxi 是 Nuxt 3 的命令行工具,它提供了多种功能,包括项目初始化、升级和生成静态文件等。nuxi upgrade 是用于升级 Nuxt 3 的命令。升级 Nuxt 3 的步骤接下来,我们将详细说明如何使用 nuxi upgrade 命令来升级 Nuxt 3。步骤 1:打开终端首先,确保你已经打开了终端窗口,并且已经导航到你的 Nuxt 3 项目的根目录。步骤 2:运行升级命令要升级 Nuxt 3,可以使用以下命令:npx nuxi upgrade这个命令将会自动检查你的项目是否有可用的 Nuxt 3 更新,并将其升级到最新版本。步骤 3:使用选项(可选)nuxi upgrade 还支持一些选项。最常用的是 --force 或 -f 选项。如果你想在升级之前删除 node_modules 和锁定文件(package-lock.json 或 yarn.lock),可以使用以下命令:npx nuxi upgrade --force这样做会确保你的依赖项是全新的,有时可以避免由于旧的依赖项而导致的兼容性问题。完整命令示例以下是你在执行命令时可能看到的输出示例:$ npx nuxi upgrade Checking for updates... Upgrading Nuxt 3 to version x.x.x... Deleting old node_modules and lock files... Installing new dependencies... Upgrade complete!步骤 4:测试项目在升级完成后,记得测试你的项目以确保一切正常运行。你可以使用以下命令启动项目:npm run dev打开浏览器,访问 http://localhost:3000,查看项目是否正常工作。注意事项备份代码: 在进行重大升级时,建议提前备份你的项目代码,以防意外情况发生。检查文档: 每次升级后,查看 Nuxt 3 的官方文档 以获取新特性和不兼容变更的信息。依赖问题: 升级可能会出现依赖问题,特别是使用了一些第三方库时。确保查看项目的依赖关系,以便在需要的时候进行更新。小结通过以上步骤,你可以轻松地使用 nuxi upgrade 命令来升级你的 Nuxt 3 项目。记得保持代码的备份,并测试项目以确保顺利过渡。转载自https://www.cnblogs.com/Amd794/p/18406249
  • [技术干货] 如何在 Nuxt 3 中有效使用 TypeScript
    TypeScript 是 JavaScript 的一个超集,它为代码添加了静态类型,可以在开发时提供更准确的类型信息和更好的代码补全体验。Nuxt 3完全支持 TypeScript,本文将逐步指导你如何在 Nuxt 3 项目中启用和使用 TypeScript,包括如何进行类型检查、自动生成类型和一些高级选项的配置。1. 创建新 Nuxt 项目如果你还没有 Nuxt 3 项目,可以使用以下命令创建一个新的项目:npx nuxi init my-nuxt-app cd my-nuxt-app npm install2. 安装 TypeScript 相关依赖默认情况下,Nuxt 3 的开发和构建过程中不会进行类型检查。为了启用类型检查,你需要安装 vue-tsc 和 typescript 作为开发依赖:npm install --save-dev vue-tsc typescript或者使用 Yarn:yarn add --dev vue-tsc typescript3. 在项目中进行类型检查安装完 TypeScript 相关依赖之后,你可以使用 nuxi typecheck 命令进行类型检查:npx nuxi typecheck这将扫描你的代码并报告任何类型错误。3.1 在 nuxt.config.ts 中启用类型检查你还可以通过在 nuxt.config.ts 文件中添加 typescript.typeCheck 选项,以便在开发和构建过程中自动启用类型检查:// nuxt.config.ts export default defineNuxtConfig({ typescript: { typeCheck: true } })4. 自动生成的类型当你运行 nuxi dev 或 nuxi build 时,Nuxt 会在 .nuxt 目录中自动生成类型文件,这些文件包括:.nuxt/nuxt.d.ts: 这个文件包含你使用的任何模块的类型和 Nuxt 所需的关键类型,帮助你的 IDE 准确识别类型。.nuxt/tsconfig.json: 此文件提供项目的基本 TypeScript 配置,包括 Nuxt 注入的解析别名。4.1 使用自动生成的类型为确保 IDE 能够识别这些类型,你必须先运行 nuxi dev 或 nuxi build。例如:npx nuxi dev5. 更严格的类型检查TypeScript 提供了一些更高的类型检查功能,以提高代码的安全性。你可以通过在 nuxt.config.ts 文件中设置 strict选项来启用更严格的检查:// nuxt.config.ts export default defineNuxtConfig({ typescript: { strict: true } })启用严格模式后,TypeScript 将应用更严格的类型检查规则,有助于提高代码质量。6. 示例:创建一个简单的 TypeScript 组件现在,我们来创建一个简单的 TypeScript 组件,以演示如何在 Nuxt 项目中使用 TypeScript。6.1 创建一个 TypeScript 组件在 components 目录下创建一个新的 TypeScript 文件,例如 HelloWorld.tsx:// components/HelloWorld.tsx import {defineComponent} from 'vue'; export default defineComponent({ props: { title: { type: String, required: true, }, }, setup(props) { return () => ( <div> <h1>{props.title}</h1> </div> ); }, });6.2 使用组件在你的页面中使用刚刚创建的组件。例如,在 pages/index.vue 中使用:<template> <div> <HelloWorld title="Hello, Nuxt with TypeScript!"/> </div> </template> <script lang="ts" setup> import HelloWorld from '@/components/HelloWorld'; </script>6.3 启动 Nuxt 应用现在你可以启动 Nuxt 应用,查看效果:npx nuxi dev访问 http://localhost:3000,你应该可以看到标题 Hello, Nuxt with TypeScript! 被正确渲染。7. 其他注意事项扩展 tsconfig.json: 如果你需要调整生成的 .nuxt/tsconfig.json 文件,你可以在 nuxt.config.ts 中使用 alias属性进行扩展。覆盖配置: 注意,从 .nuxt/tsconfig.json 中扩展的配置选项可能会被自定义的 tsconfig.json 中的设置覆盖。总结通过上述步骤,你已经成功启用和使用 TypeScript,在 Nuxt 3 项目中进行类型检查,并创建一个简单的 TypeScript 组件。TypeScript的强大类型系统将帮助你在编写代码时更好地发现潜在错误,提升开发体验。转载自https://www.cnblogs.com/Amd794/p/18404451
  • [技术干货] 使用 nuxi preview 命令预览 Nuxt 应用
    在开发基于 Nuxt.js 的应用时,最后一步通常是构建和预览应用,以便确保一切正常。在这一过程中,nuxi preview 命令能够帮助你快速启动一个服务器来预览你的应用。什么是 nuxi preview?nuxi preview 命令用于在你构建了 Nuxt 应用后,启动一个服务器以便进行预览。它通常在运行 nuxi build 命令后使用,以便你可以在本地验证应用是否按预期运行。除此之外,start 命令也是 preview 的一个别名。安装和准备环境在使用 nuxi preview 之前,请确保你已经安装了 Node.js、npm,以及一个新的 Nuxt 项目。1. 创建一个新的 Nuxt 项目如果你尚未创建 Nuxt 项目,可以使用如下命令:npx nuxi init my-nuxt-app进入项目目录并安装依赖:cd my-nuxt-app npm install2. 构建项目在预览应用之前,你需要首先构建它。运行以下命令进行构建:npx nuxi build上述命令会为你的应用生成生产环境的构建文件。使用 nuxi preview 命令1. 启动预览服务器构建完成后,在项目根目录中运行以下命令来启动预览服务器:npx nuxi preview此命令将在默认网址 http://localhost:3000 启动服务器。2. 指定根目录如果你的 Nuxt 应用程序不在当前目录中,可以通过 rootDir 参数来指定其他目录。例如:npx nuxi preview /path/to/your/app3. 使用自定义 .env 文件你可以通过 --dotenv 选项指定自定义的 .env 文件,以便于在预览期间加载其他环境变量。例如:npx nuxi preview --dotenv .env.production此命令会加载指定的 .env.production 文件。示例:完整的预览流程以下是一个完整的命令执行示例步骤:创建新的 Nuxt 项目:npx nuxi init my-nuxt-app cd my-nuxt-app npm install构建项目:npx nuxi build启动预览服务器:在项目根目录中运行:npx nuxi preview访问预览应用:打开浏览器,访问 http://localhost:3000,你将看到应用的预览界面。其他注意事项在执行 nuxi preview 时,process.env.NODE_ENV 将被设置为 production。如果你希望覆盖此设置,可以在 .env 文件中定义 NODE_ENV 或通过命令行参数传入。预览模式下,.env 文件将被加载到 process.env 中,但在生产环境中,确保你手动设置环境变量。总结通过使用 nuxi preview 命令,你可以迅速预览构建后的 Nuxt 应用程序。这是验证你应用在生产环境下行为的重要步骤。转载自https://www.cnblogs.com/Amd794/p/18402789
  • [技术干货] 使用 nuxi prepare 命令准备 Nuxt 项目
    在开发基于 Nuxt.js 的应用时,有时你需要准备项目环境,以便进行构建和部署。nuxi prepare命令正是为此而设计的,它将创建 .nuxt 目录并生成类型信息,方便后续操作。什么是 nuxi prepare?nuxi prepare 是 Nuxt.js 提供的一个命令,用于在应用中创建一个名为 .nuxt的目录并生成相应的类型信息。这对于持续集成(CI)环境或在 package.json 中作为 postinstall 命令非常有用。通过执行这个命令,Nuxt.js会确保项目的结构在构建之前是正确的。安装和准备环境在使用 nuxi prepare 之前,请确保你已经安装了 Node.js、npm 和 Nuxt。在本文中假设你已经安装好基础环境。1. 创建一个新的 Nuxt 项目如果你尚未创建 Nuxt 项目,可以使用如下命令:npx nuxi init my-nuxt-app然后进入项目目录:cd my-nuxt-app接着安装依赖:npm install使用 nuxi prepare 命令1. 基本用法在项目目录中运行以下命令来准备应用:npx nuxi prepare该命令将在项目中创建 .nuxt 目录,并生成所需的类型信息。该操作可以确保你的 Nuxt 项目在构建之前已正确配置和准备。2. 指定根目录如果你的 Nuxt 应用程序不在当前目录中,可以通过 rootDir 参数来指定其他目录。例如:npx nuxi prepare /path/to/your/app这会在指定目录中执行准备工作。3. 设置日志级别你还可以通过 --log-level 选项指定日志级别。常见的日志级别包括 info、warn 和 error:npx nuxi prepare --log-level warn示例:完整的准备流程以下是一个完整的命令执行示例步骤:创建新的 Nuxt 项目:npx nuxi init my-nuxt-app cd my-nuxt-app npm install准备项目:在项目目录中,运行:npx nuxi prepare查看结果:准备完成后,你将注意到项目中生成了 .nuxt 目录,你可以通过以下命令查看其内容:ls .nuxt你会看到若干文件和目录,如 build 和 dist,这说明项目已经成功准备好。总结nuxi prepare 命令是确保 Nuxt 项目处于良好状态的重要工具,它将创建 .nuxt 目录并生成类型信息,方便后续的构建和运行。转载自https://www.cnblogs.com/Amd794/p/18401638
  • [技术干货] 使用 nuxi init 创建全新 Nuxt 项目
    Nuxt.js 是一个流行的 Vue.js 框架,可以帮助开发者快速构建高效的 Web 应用程序。而 nuxi init 命令则是用来初始化一个全新的Nuxt 项目的工具。什么是 nuxi init?nuxi init 命令是 Nuxt.js 的一部分,用于创建一个新的 Nuxt 项目。你可以选择使用默认模板或指定自己的模板,从而快速启动一个新的项目。安装和准备环境在使用 nuxi init 之前,请确保你已经安装了 Node.js 和 npm。接下来,你可以通过以下步骤来创建一个全新的 Nuxt 项目。安装步骤安装 Node.js:访问 Node.js 官方网站 下载并安装 Node.js,这通常包括 npm(Node PackageManager)。确保 npx 可用:npx 是 npm 的一部分,通常会随着 Node.js 的安装一同安装。你可以在终端中运行以下命令确认 npx 是否可用:npx --version创建新的 Nuxt 项目1. 运行 nuxi init在终端中使用以下命令来初始化一个新的 Nuxt 项目。默认情况下,你可以执行以下命令:npx nuxi init my-nuxt-app在这里,my-nuxt-app 是你项目的名称。你可以根据需要更改它。2. 使用具体模板如果你希望使用特定模板,则可以使用 --template 或 -t 选项。例如,如果你想使用官方的 v3 模板,你可以执行以下命令:npx nuxi init --template v3 my-nuxt-app或者,如果你有自己的 GitHub 模板,可以用以下格式指定:npx nuxi init --template gh:org/name my-nuxt-app3. 强制克隆现有目录如果你想强制克隆到一个已经存在的目录,可以加上 --force 选项:npx nuxi init --force my-existing-app4. 启动项目进入项目目录:cd my-nuxt-app然后,安装依赖:npm install5. 启动开发服务器安装完成后,你可以启动开发服务器:npm run dev打开浏览器,访问 http://localhost:3000,你将看到新的 Nuxt 应用程序正在运行。示例:完整的项目初始化流程以下是一个完整的命令执行示例步骤:打开终端。执行创建项目命令:npx nuxi init my-nuxt-app进入项目目录:cd my-nuxt-app安装依赖:npm install启动开发服务器:npm run dev转载自https://www.cnblogs.com/Amd794/p/18399860
  • [技术干货] 使用 nuxi info 查看 Nuxt 项目详细信息
    在开发 Nuxt.js 应用程序时,了解项目的详细信息是非常重要的。这不仅可以帮助你确认项目配置,还可以快速识别可能出现的问题。nuxi info 命令正是为此而设计的,它能够记录并展示当前或指定 Nuxt 项目的信息。什么是 nuxi info?nuxi info 是 Nuxt 的一个命令行工具,主要用于获取有关当前或指定 Nuxt 项目的信息。它将输出项目的各种细节,例如版本、配置文件、模块、插件等,使开发者能够更好地了解项目运行的状态。安装和准备 Nuxt 项目在开始之前,请确保你已经安装了 Node.js 和 Nuxt。如果还没有,你可以通过以下步骤创建一个新的 Nuxt 应用。安装步骤安装 Node.js:访问 Node.js 官方网站 下载并安装 Node.js。创建 Nuxt 应用:使用以下命令创建一个新的 Nuxt 应用:npx nuxi@latest init my-nuxt-app按照提示选择适合你的选项,完成项目创建后,进入项目目录:cd my-nuxt-app使用 nuxi info 命令运行命令在你的 Nuxt 项目目录中,可以使用以下命令获取项目信息:npx nuxi info这将输出当前项目的详细信息,包括但不限于以下内容:Nuxt 版本Vue 版本项目根目录配置文件位置(如 nuxt.config.js)已安装的模块及其版本其他项目相关信息指定根目录如果你的 Nuxt 应用程序不在当前目录中,你可以指定其他目录。例如:npx nuxi info /path/to/your/app这一命令会输出位于指定目录的 Nuxt 项目的信息。示例:运行 nuxi info1. 进入项目目录首先确保你的终端位于 Nuxt 项目的根目录。例如:cd my-nuxt-app2. 执行命令在终端中输入:npx nuxi info3. 查看输出你将看到类似于以下的输出:Nuxt Version: 3.x.x Vue Version: 3.x.x Root Directory: /path/to/my-nuxt-app Config File: nuxt.config.ts Modules: - @nuxtjs/axios v5.x.x - @nuxtjs/pwa v3.x.x ...输出中将包含项目的各种详细信息,包括当前使用的 Nuxt 版本、Vue 版本、根目录及已安装模块等。总结nuxi info 命令是一个极其有用的工具,可以快速提供关于 Nuxt 项目的关键信息。无论你是在查找特定模块的版本还是想了解项目配置,nuxi info 都能为你提供帮助。转载自https://www.cnblogs.com/Amd794/p/18397743
总条数:269 到第
上滑加载中