基於svelte3.x+svelteKit構建仿微信App聊天應用svelte-chatroom。
svelte-chatroom 基於svelte.js+svelteKit+mescroll.js+svelte-popup等技術搭建開發的仿微信app介面聊天專案。支援傳送圖文訊息/gif動圖、圖片/視訊預覽、下拉重新整理、紅包及朋友圈等功能。
一、技術框架
- 編碼器:VScode
- 框架技術:svelte^3.46.0+svelteKit
- 下拉元件:mescroll.js^1.4.2
- 樣式處理:sass+svelte-preprocess
- 彈窗元件:svelte-popup
- 資料模擬:mockjs^1.1.0
svelte.js 一款號稱比vue.js還快的前端新框架。體積小、執行速度快、無虛擬DOM、快速的響應能力。
二、專案結構目錄
使用svelte+svelteKit構建的專案,目錄結構如下。
◆ Svelte.js自定義導航欄Navbar+選單欄Tabbar
專案中頂部導航條及底部選單欄均是基於svelte定製開發的自定義元件。
至於如何使用svelte開發自定義元件,就不作過多的介紹,大家感興趣的話,可以去看看這篇分享文章。
https://www.cnblogs.com/xiaoyan2017/p/15996146.html
◆ Svelte.js自定義手機端彈窗元件
svelte-popup 一款基於Svelte3.x開發自定義多功能svPopup彈出框元件,支援超過20+引數自由配置、元件式+函式式混合呼叫方式。
具體的實現步驟這裡不作詳細介紹,大家可以去看看下面這篇分享文章。
https://www.cnblogs.com/xiaoyan2017/p/16015575.html
◆ svelte.config.js配置檔案
如何在svelte.js專案中使用sass/less編寫樣式?可以安裝 sass 及 svelte-preprocess 依賴。
/** * svelte.config.js基礎配置檔案 */ import adapter from '@sveltejs/adapter-auto' import path from 'path' import SvelteProcess from 'svelte-preprocess' /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { adapter: adapter(), vite: { resolve: { alias: { '@': path.resolve('./src'), '@assets': path.resolve('./src/assets'), '@utils': path.resolve('./src/utils') } } } }, // allow you to use Svelte with tools like TypeScript, PostCSS, SCSS, and Less. preprocess: SvelteProcess() }; export default config
◆ SvelteKit公共模板及錯誤頁
使用svelteKit構建的專案,公共模板__layout.svelte及錯誤頁__error.svelte配置如下。
<script> import { onMount } from 'svelte' import { page } from '$app/stores' import { goto } from '$app/navigation' import { userinfo } from '@/store/index.js' let whiteRoute = ['/auth/login', '/auth/register'] onMount(() => { if(!$userinfo) { goto('/auth/login') }else { if(whiteRoute.includes($page.url.pathname)) { goto('/') }else { goto($page.url.pathname) } } }) </script> <div class="sv__container flexbox flex-col"> <slot /> </div> <style> @import '@/app.scss'; @import '@assets/css/reset.scss'; @import '@assets/css/layout.scss'; @import '@assets/fonts/iconfont.css'; </style>
<!-- //Svelte錯誤頁 --> <script context="module"> export function load({ error, status }) { return { props: { error, status } } } </script> <script> import Navbar from '$lib/Navbar' export let status export let error function goBack() { history.go(-1) } </script> <svelte:head> <title>404錯誤</title> </svelte:head> <Navbar title="Page Error!!!" /> <div class="sv__scrollview flex1"> <div class="sv__page-error flexbox flex-col flex-alignc flex-justifyc"> <div class="sv__page-error-img"> <img src="404.png" alt="" /> </div> <div class="sv__page-error-content"> <div class="c-red fs-36">┗| {status} |┛ 嗷~~</div> <div class="c-999 mt-10">{error.message}</div> <div class="mt-20 sv__btn sv__btn-default" on:click={goBack}><i class="iconfont icon-arrL"></i> 返回首頁</div> </div> </div> </div>
◆ Svelte.js狀態管理+本地儲存
svelte框架也提供了建立狀態管理svelte/store,配置localStorage本地化儲存服務。
/** * Svelte狀態管理 */ import { writable } from 'svelte/store' const createStore = (value, key) => { const { subscribe, set, update } = writable(value) return { // 持久化儲存 useStorage: () => { const data = localStorage.getItem(key) if(data) { set(JSON.parse(data)) } // 訂閱 subscribe(val => { [null, undefined].includes(val) ? localStorage.removeItem(key) : localStorage.setItem(key, JSON.stringify(val)) }) }, subscribe, set, update, } } export const userinfo = createStore(localStorage.getItem('userinfo')||null, 'userinfo')
◆ Svelte.js實現仿朋友圈下拉重新整理
使用 svelte.js+mescroll 實現仿朋友圈下拉轉圈功能。
<!-- //朋友圈模板 --> <script> import { onMount } from 'svelte' import Navbar from '$lib/Navbar' import MeScroll from 'mescroll.js/mescroll.min.js' import 'mescroll.js/mescroll.min.css' onMount(() => { let mescroll = new MeScroll('mescroll', { down: { auto: false, offset: 40, callback: downCallback }, // up: { // callback: upCallback // } }) // 下拉重新整理的回撥 function downCallback() { console.log('下拉重新整理...') setTimeout(() => { // 隱藏下拉重新整理的狀態; mescroll.endSuccess() }, 2000) } // 上拉載入的回撥 page = {num:1, size:10}; num:當前頁 預設從1開始, size:每頁資料條數,預設10 function upCallback(page) { console.log('上拉載入...') var pageNum = page.num; // 頁碼, 預設從1開始 var pageSize = page.size; // 頁長, 預設每頁10條 } }) // ... </script> <Navbar title="朋友圈" center transparent> <svelte:fragment slot="right"> <div><i class="iconfont icon-tupian"></i></div> <div class="ml-30"><i class="iconfont icon-fabu"></i></div> </svelte:fragment> </Navbar> <div class="sv__scrollview flex1"> <div id="mescroll" class="mescroll"> <div> <div class="sv__uzone"> ... </div> </div> </div> </div>
◆ Svelte實現聊天功能
聊天頁面文字框支援文字+emoj混排,游標處插入表情、網址/圖片/視訊預覽、紅包等功能。並且底部文字框單獨抽離了一個editor.svelte元件。
<script> /** * @Desc Svelte.js實現聊天框元件 * @Time andy by 2021-01 * @About Q:282310962 wx:xy190310 */ // 編輯器內容 export let editor import { tick, createEventDispatcher } from 'svelte' const dispatch = createEventDispatcher() let editorNode let lastCursor = null // 獲取游標最後位置 function getLastCursor() { let sel = window.getSelection() if(sel && sel.rangeCount > 0) { return sel.getRangeAt(0) } } // 游標位置插入內容 export async function addHtmlInCursor(html) { // ... } // 刪除編輯器內容 export async function deleteHtml() { let range let sel = window.getSelection() if(lastCursor) { sel.removeAllRanges() sel.addRange(lastCursor) } range = getLastCursor() range.collapse(false) document.execCommand('delete') await tick() editorNode.blur() } function handleInput() { editor = editorNode.innerHTML lastCursor = getLastCursor() } function handleClick() { dispatch('click') lastCursor = getLastCursor() } function handleFocus() { dispatch('focus') lastCursor = getLastCursor() } function handleBlur() { dispatch('blur') } </script> <div class="editor" bind:this={editorNode} contenteditable="true" bind:innerHTML={editor} on:input={handleInput} on:click={handleClick} on:focus={handleFocus} on:blur={handleBlur} style="user-select: text; -webkit-user-select: text;" ></div>
以上就是基於svelte.js+svelteKit開發仿微信app介面聊天例項的一些分享,希望對大家有所幫助!
最後附上一個uniapp+uview-ui開發移動端後臺管理系統
https://www.cnblogs.com/xiaoyan2017/p/15836112.html