框架太“重”了:通常一个小型项目只由少数几个简单页面构成,如果使用 Vue 或者 React 这些框架来研发的话,有点“大材小用”了。构建的产物中包含了不少框架运行时代码(虚拟 DOM、响应式、状态管理等),这些代码对于小型项目而言是冗余的,它们影响了包体大小,进而影响页面的启动速度和执行性能。
打包太慢了:以 Vue CLI 为例,它的底层基于 Webpack,虽然 Webpack 具备更强大的功能和灵活性,但相比于 Vite、Esbuild 这些以速度为标杆的构建工具来说,它的速度确实慢了一些,影响了研发效率。
@
目录
- 一、 创建基本项目
- 1.1 全局安装 Vite
- 1.2 创建 Svelte 项目
- 二、目录结构
- 三、svelte路由配置
- 3.1 npm安装
- 3.2 定义router
- 3.2.1 动态导入组件
- 3.2.2 在页面之间导航
- 3.3 使用路由
- 四、svelte CSS预处理器
- 4.1 less的使用
- 4.2 Tailwind CSS的使用
- 五、svelte环境变量配置
- 5.1 环境变量命名规则
- 5.2 .env文件的使用
- 5.3 在代码中使用环境变量
- 5.4 配置运行与打包环境
- 六、svelte国际化
- 6.1 安装 svelte-i18n
- 6.2 初始化 svelte-i18n
- 6.3 创建语言文件
- 6.4 在 Svelte 组件中使用 svelte-i18n
- 6.5 切换语言
- 6.6 在 App.svelte 中引入 i18n.js
- 6.7 运行项目
- 6.8 构建项目
- 6.9 预览项目
- 6.10 检查项目
- 七、svelte接口请求
- 7.1 安装 axios
- 7.2 创建 axios 实例
- 7.3 在 Svelte 组件中使用 axios
- 7.4 处理请求和响应拦截器
- 7.5 在 App.svelte 中使用 axios
- 7.6 处理错误
- 八、svelte组件库
- 九、svelte阿里图标库
- 9.1 获取阿里图标
- 9.2 将图标文件放入项目
- 9.3 引入图标文件
- 9.4 使用图标
- 9.5 动态切换图标
- 9.6 使用 Symbol 方式(可选)
- 9.7 样式调整(可选)
- 9.8 示例代码
- 十、svelte轮播图
- 十一、store数据共享
- 1. 创建 store 模块
- 2. 创建全局 store
- 3. 在组件中使用 store
- 4. 封装 store 的优势
- 5. 示例:about.svelte 中使用 store
- 十二、扩展内容
- 十三、框架git地址
一、 创建基本项目
1.1 全局安装 Vite
通过 npm 全局安装 Vite1.2 创建 Svelte 项目
Vite 原生支持直接通过脚手架创建 Svelte 项目,执行以下命令输入命令后选择如下- ✔ Project name: vite-svelte
- ? Select a framework: › - Use arrow-keys. Return to submit.
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Vanilla
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Vue
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>React
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Preact
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Lit
- ❯<svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg>Svelte
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Solid
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Qwik
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Others
- ? Select a variant: › - Use arrow-keys. Return to submit.
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>TypeScript
- ❯<svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg>JavaScript
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>SvelteKit
复制代码 基本项目创建完成
二、目录结构
根据上一步创建项目,项目的基本结构栓是完成了,但这样还是不够的,接下来介绍一下完整的项目目录
三、svelte路由配置
3.1 npm安装
项目中安装svelte-spa-router- npm install svelte-spa-router
复制代码 3.2 定义router
- 每条路由都是一个普通的Svelte组件,包含标记、脚本、绑定等。任何Svelte组件都可以是路由。
- 路由定义只是一个JavaScript字典(对象),其中键是一个带有路径(包括参数等)的字符串,值是路由对象。
- import Home from './routes/Home.svelte'
- import Author from './routes/Author.svelte'
- import Book from './routes/Book.svelte'
- import NotFound from './routes/NotFound.svelte'
- const routes = {
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// Exact path
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'/': Home,
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// Using named parameters, with last being optional
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'/author/:first/:last?': Author,
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// Wildcard parameter
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'/book/*': Book,
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// Catch-all
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// This is optional, but if present it must be the last
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'*': NotFound,
- }
复制代码 3.2.1 动态导入组件
使用动态导入的优点是,如果您的打包器支持,您可以启用代码拆分并减小发送给用户的捆绑包的大小。这已经用包括Rollup和Webpack在内的捆绑器进行了测试
- 要使用动态导入的组件,您需要利用包装方法(根据路线包装文档,该方法可用于各种操作)。首先,导入wrap方法:
- import {wrap} from 'svelte-spa-router/wrap'
复制代码
- 然后,在路由定义中,使用wrap方法包装路由,将一个函数传递给asyncComponent属性,该函数将动态导入的组件返回给asyncComponent:
- wrap({
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>asyncComponent: () => import('./Foo.svelte')
- })
复制代码 案例:- // Import the wrap method
- import {wrap} from 'svelte-spa-router/wrap'
- // Note that Author and Book are not imported here anymore, so they can be imported at runtime
- import Home from './routes/Home.svelte'
- import NotFound from './routes/NotFound.svelte'
- const routes = {
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'/': Home,
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// Wrapping the Author component
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'/author/:first/:last?': wrap({
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>asyncComponent: () => import('./routes/Author.svelte')
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>}),
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// Wrapping the Book component
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'/book/*': wrap({
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>asyncComponent: () => import('./routes/Book.svelte')
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>}),
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// Catch-all route last
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'*': NotFound,
- }
复制代码 3.2.2 在页面之间导航
- use:link导航(可以使用use:link操作,而不必在每个链接前键入#)
3.3 使用路由
在app.svelte中全局调用- import Router from 'svelte-spa-router'
复制代码 然后,通过将组件放置在标记中,将路由器显示在您想要的任何位置- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>
复制代码 四、svelte CSS预处理器
4.1 less的使用
4.1.1 npm安装
安装less与svelte-preprocess-less依赖- npm install --save-dev svelte-preprocess-less less
复制代码 在vite.config.js进行配置- import { less } from 'svelte-preprocess-less'export default defineConfig({<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>plugins: [svelte({<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>preprocess: {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> style: less(),<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>},<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> })],})
复制代码 4.2 Tailwind CSS的使用
通过npx安装直接配置完 tailwindcss五、svelte环境变量配置
Vite中使用环境变量主要通过.env文件来配置,这些文件根据不同的环境(开发、测试、生产等)有不同的命名规则和使用方式。
5.1 环境变量命名规则
所有环境变量必须以VITE_为前缀- VITE_API_URL=https://api.example.com
- VITE_APP_TITLE=My Vite App
复制代码 5.2 .env文件的使用
1. 通用环境变量:在项目的根目录下创建.env文件,用于定义所有环境通用的变量。
2. 特定环境变量:根据不同的环境需求,可以创建以下类型的.env文件:
.env.devt:仅在开发环境中使用。
.env.pro:仅在生产环境中使用。
.env.local:通用的本地配置文件,通常不提交到版本控制系统中。
.env.development.local:开发环境的本地配置文件。
.env.production.local:生产环境的本地配置文件
5.3 在代码中使用环境变量
- console.log(import.meta.env.VITE_API_URL);
复制代码 5.4 配置运行与打包环境
- "scripts": {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>"dev": "vite --mode dev",//运行dev环境<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>"dev-pro": "vite --mode pro",//运行pro环境<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>"build": "vite build",<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>"preview": "vite preview",<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>"check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" },
复制代码 六、svelte国际化
svelte-i18n 是一个用于 Svelte 应用的国际化(i18n)库,它可以帮助你轻松地管理和切换应用中的多语言内容。以下是如何在 Svelte 项目中使用 svelte-i18n 的基本步骤:
6.1 安装 svelte-i18n
首先,确保你已经安装了 svelte-i18n。根据你的 package.json 文件,它已经存在于 dependencies 中。6.2 初始化 svelte-i18n
在你的 Svelte 项目中,通常会在 src 目录下创建一个 i18n.js 或 i18n.ts 文件来初始化 svelte-i18n。- // src/i18n.js
- import { init, register, locale } from 'svelte-i18n';
- // 注册默认语言
- register('en', () => import('./locales/en.json'));
- register('zh', () => import('./locales/zh.json'));
- // 初始化并设置默认语言
- init({
- fallbackLocale: 'en',
- initialLocale: 'en',
- });
复制代码 6.3 创建语言文件
在 src/locales 目录下创建语言文件,例如 en.json 和 zh.json。- // src/locales/en.json
- {
- "welcome": "Welcome to Svelte App",
- "greeting": "Hello, {name}!"
- }
复制代码- // src/locales/zh.json
- {
- "welcome": "欢迎使用 Svelte 应用",
- "greeting": "你好, {name}!"
- }
复制代码 6.4 在 Svelte 组件中使用 svelte-i18n
你可以在 Svelte 组件中使用 $t 函数来获取翻译内容。- <h1>{$t('welcome')}</h1>
- <p>{$t('greeting', { name: 'John' })}</p>
复制代码 6.5 切换语言
你可以通过 locale.set 方法来动态切换语言。- <button on:click={() => locale.set('en')}>English</button>
- <button on:click={() => locale.set('zh')}>中文</button>
复制代码 6.6 在 App.svelte 中引入 i18n.js
- 确保在 App.svelte 或你的主入口文件中引入 i18n.js。
- [/code][list=1]
- [*]确保加载完i18n后在加载页面
- [/list][code]{#if $locale}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>{/if}
复制代码 6.7 运行项目
使用 npm run dev 运行你的项目,你应该能够看到国际化内容并根据按钮切换语言。
6.8 构建项目
当你准备好发布项目时,使用 npm run build 来构建项目。6.9 预览项目
使用 npm run preview 来预览构建后的项目。6.10 检查项目
使用 npm run check 来检查 Svelte 和 TypeScript 的类型。通过以上步骤,你应该能够在 Svelte 项目中成功使用 svelte-i18n 来实现国际化功能。
七、svelte接口请求
在 Svelte 项目中使用 axios 进行 HTTP 请求是非常常见的操作。以下是如何在 Svelte 项目中集成和使用 axios 的步骤:
7.1 安装 axios
首先,确保你已经安装了 axios。根据你的 package.json 文件,它已经存在于 dependencies 中。7.2 创建 axios 实例
为了更好的管理和配置 axios,通常会在 src/utils 目录下创建一个 api.ts 或 api.js 文件来创建 axios 实例。- // src/utils/api.tsimport axios from 'axios';const api = axios.create({ baseURL: 'https://api.example.com', // 你的 API 基础 URL timeout: 10000, // 请求超时时间 headers: {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'Content-Type': 'application/json', },});export default api;
复制代码 7.3 在 Svelte 组件中使用 axios
你可以在 Svelte 组件中导入并使用 axios 实例来发送 HTTP 请求。- {#if data}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> [size=6]{data.title}[/size]
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>{data.description}
- {/if}
复制代码 7.4 处理请求和响应拦截器
你可以在 axios 实例中添加请求和响应拦截器,以便在请求发送前或响应到达后进行一些处理。- // src/utils/api.tsimport axios from 'axios';const api = axios.create({ baseURL: 'https://api.example.com', timeout: 10000, headers: {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>'Content-Type': 'application/json', },});// 请求拦截器api.interceptors.request.use( (config) => {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// 在请求发送之前做一些处理,例如添加 token<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>const token = localStorage.getItem('token');<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>if (token) {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> config.headers.Authorization = `Bearer ${token}`;<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>return config; }, (error) => {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>return Promise.reject(error); });// 响应拦截器api.interceptors.response.use( (response) => {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// 对响应数据做一些处理<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>return response; }, (error) => {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>// 对响应错误做一些处理<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>return Promise.reject(error); });export default api;
复制代码 7.5 在 App.svelte 中使用 axios
你可以在 App.svelte 中使用 axios 来获取数据或执行其他 HTTP 操作。- {#if userData}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> [size=6]Welcome, {userData.name}![/size]
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Email: {userData.email}
- {/if}
复制代码 7.6 处理错误
在使用 axios 时,确保你处理了可能的错误,例如网络错误或服务器错误。- {#if userData}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> [size=6]Welcome, {userData.name}![/size]
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Email: {userData.email}
- {:else if errorMessage} {errorMessage}
- {/if}
复制代码 通过以上步骤,你应该能够在 Svelte 项目中成功使用 axios 来进行 HTTP 请求。
八、svelte组件库
这里用的是melt-ui,访问地址是:https://www.melt-ui.com/docs/introduction
一键配置- npx @melt-ui/cli@latest init
复制代码 九、svelte阿里图标库
在 Svelte 项目中使用阿里图标(如 iconfont)可以通过以下步骤实现:
9.1 获取阿里图标
- 访问 iconfont 并登录。
- 创建一个项目,将需要的图标添加到项目中。
- 选择 Font class 或 Symbol 方式生成代码。
- 点击 下载至本地,解压后得到图标文件。
9.2 将图标文件放入项目
将下载的图标文件(如 iconfont.css 和字体文件)放入项目的 public 或 src/assets 目录中。
例如:- public/ iconfont/<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>iconfont.css<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>iconfont.ttf<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>iconfont.woff<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>iconfont.woff2
复制代码 9.3 引入图标文件
在 App.svelte 或 main.ts 中引入 iconfont.css 文件。- [/code][size=4]9.4 使用图标[/size]
- 在 Svelte 组件中使用阿里图标,直接通过 class 引用图标类名。
- [code]<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>
复制代码 9.5 动态切换图标
如果需要动态切换图标,可以将图标类名绑定到变量。- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> iconClass = 'icon-user'}>切换图标
复制代码 9.6 使用 Symbol 方式(可选)
如果选择 Symbol 方式,需要引入 iconfont.js 文件,并使用 标签。- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg>
复制代码 9.7 样式调整(可选)
如果需要调整图标大小或颜色,可以通过 CSS 设置。- [/code][size=4]9.8 示例代码[/size]
- 以下是一个完整的示例:
- [code]{#if $locale}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> {#if $toast.visible}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> {/if}{/if}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> iconClass = 'icon-user'}>切换图标
复制代码 通过以上步骤,你可以在 Svelte 项目中成功使用阿里图标。如果需要更多定制化功能,可以参考 iconfont 官方文档。
十、svelte轮播图
这里用的是https://3.swiper.com.cn/
下载引入相关css与js即可
demo如下- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>Slide 1<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> Slide 2<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>
复制代码 十一、store数据共享
在 Svelte 中,store 是一个核心概念,用于管理应用的状态。为了更好地组织代码,可以将 store 封装为模块,包括 state、actions、getters 和 mutations,类似于 Vuex 或 Redux 的设计模式。以下是如何封装 store 的示例:
1. 创建 store 模块
在 src/store 目录下创建一个模块,例如 centerStore.ts,用于管理特定模块的状态和逻辑。- // src/store/centerStore.tsimport { writable, derived } from 'svelte/store';// Stateconst state = writable({ userData: null, loading: false, error: null,});// Actionsconst actions = { async getUserData(params: { onlyMakeTheSame: boolean }) {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>try {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> state.update((s) => ({ ...s, loading: true, error: null }));<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> // 模拟 API 调用<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> const response = await fetch('/api/user', { method: 'GET' });<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> const data = await response.json();<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> state.update((s) => ({ ...s, userData: data, loading: false }));<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>} catch (error) {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> state.update((s) => ({ ...s, error: error.message, loading: false }));<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>} },};// Gettersconst getters = { userData: derived(state, ($state) => $state.userData), isLoading: derived(state, ($state) => $state.loading), error: derived(state, ($state) => $state.error),};// Mutations (可选)const mutations = { setUserData(userData: any) {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>state.update((s) => ({ ...s, userData })); },};// 导出模块export const centerStore = { state, actions, getters, mutations,};
复制代码 2. 创建全局 store
在 src/store/index.ts 中整合所有模块,创建一个全局 store。- // src/store/index.ts
- import { centerStore } from './centerStore';
- export const store = {
- center: centerStore,
- };
复制代码 3. 在组件中使用 store
在 Svelte 组件中导入并使用 store。- {#if $getters.isLoading} Loading...
- {:else if $getters.error} Error: {$getters.error}
- {:else if $getters.userData}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> [size=6]User Data[/size]
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>{JSON.stringify($getters.userData, null, 2)} {/if}Refresh Data
复制代码 4. 封装 store 的优势
- 模块化:将状态和逻辑按模块划分,便于维护和扩展。
- 复用性:actions 和 getters 可以在多个组件中复用。
- 可测试性:actions 和 mutations 可以单独测试。
- 清晰性:state、actions、getters 和 mutations 分离,代码结构更清晰。
5. 示例:about.svelte 中使用 store
根据你的 about.svelte 文件,可以这样使用 store:- [size=6]{$t("welcome")}[/size]
- {$t("about")}
- 获取接口数据{#if $store.center.getters.isLoading} Loading...
- {:else if $store.center.getters.error} Error: {$store.center.getters.error}
- {:else if $store.center.getters.userData}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> [size=6]User Data[/size]
- <body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>{JSON.stringify($store.center.getters.userData, null, 2)} {/if}
复制代码 通过以上步骤,你可以在 Svelte 项目中封装 store,并实现 state、actions、getters 和 mutations 的分离,使代码更易于维护和扩展。
十二、扩展内容
这里由于使用的melt-ui没有toast提示于是做了一个全局组建toas.svelte
- {#if visible}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> {message} {/if}
复制代码- import { writable } from 'svelte/store';function createToast() { const { subscribe, set, update } = writable({ message: '', visible: false });<svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg>function show(message, duration = 3000) {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>set({ message, visible: true });<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>setTimeout(() => {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> update(current => ({ ...current, visible: false }));<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>}, duration); }<svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg>return {<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>subscribe,<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body>show, // 公开show方法供外部调用 };} export const toast = createToast(); // 创建并导出toast服务实例
复制代码- {#if $toast.visible}<body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body><body>
- <svg aria-hidden="true">
- <use xlink:href="#icon-home"></use>
- </svg> <Router {routes}/>
- </body> {/if}
复制代码- import { toast } from '@/utils/toastService';
- toast.show('Hello, this is a toast!')
复制代码 十三、框架git地址
https://gitee.com/cyp926/svelte-vite
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |