這幾天,寫了一個(gè)Strview.js
前言
最近,這幾周更新文章的頻率明顯比之前有所降低。不是懶,主要是最近想沉淀沉淀。休息的這幾天我也有所收獲,抽著晚上的空打算自己寫一個(gè)玩具JS庫玩玩。不像很多大型框架那樣,在開發(fā)之前都有嚴(yán)思縝密的計(jì)劃。然而,我就只想動(dòng)手嘗試嘗試。所以,我寫了一個(gè)叫Strview.js這樣一個(gè)玩具JS庫。
如果您想看看呢?可以繼續(xù)讀下去。如果覺得沒啥意思的話,那可以當(dāng)做一篇爛文章,直接跳過也可以啊!
介紹
Strview.js是一個(gè)可以將字符串轉(zhuǎn)換為視圖的JS庫。這里的字符串一般指的是模板字符串。當(dāng)然你也可以使用普通字符串,只不過在特定場景下普通字符串更有局限性。所以,優(yōu)先使用模板字符串。其次Strview.js 只關(guān)注視圖層,不僅易于上手,還便于靈活拆裝不同的代碼塊。
這里是中文官方文檔地址:
- https://www.maomin.club/site/strviewjs/zh
如果您想上手項(xiàng)目,那么請(qǐng)看下面怎么安裝它吧!
安裝
CDN
直接引入以下地址:
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
如果你使用原生 ES Modules,這里也有一個(gè)兼容 ES Module 的構(gòu)建文件:
- <script type="module">
- import { createView } from 'https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.esm.js'
- </script>
NPM
最新穩(wěn)定版本:1.8.0
- npm install strview
命令行工具 (CLI)
strviewApp是基于strview.js的項(xiàng)目構(gòu)建工具,您可以使用它更方便靈活地搭建頁面。如何安裝它,你可以使用strviewCli來快速安裝strviewApp。
全局安裝
- npm install strview-cli -g
查看版本
- strview-cli -v
初始化項(xiàng)目
- strview-cli init <projectName>
快速上手
嘗試 Strview.js 最簡單的方法是使用 Hello World 例子。你可以在瀏覽器新標(biāo)簽頁中打開它,跟著例子學(xué)習(xí)一些基礎(chǔ)用法。你可以使用CDN版本下的strview.global.js。使用這個(gè)文件,會(huì)將Strview全局暴露,您可以直接調(diào)用。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Strview.js</title>
- </head>
- <body>
- <div id="app"></div>
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
- <script>
- Strview.createView({
- el: "#app",
- data: {
- msg: 'Hello World'
- },
- template: `<p>{msg}</p>`,
- });
- </script>
- </body>
- </html>
如下圖所示:
- Hello World
基本使用
創(chuàng)建視圖
使用createView方法傳入一個(gè)對(duì)象,對(duì)象屬性分別為el、data、template。el表示為要掛載的DOM 元素,data表示為觀察的數(shù)據(jù)對(duì)象,template表示為DOM模板字符串。定義好這三個(gè)屬性之后就可以生成一個(gè)預(yù)想的視圖頁面。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Strview.js</title>
- </head>
- <body>
- <div id="app"></div>
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
- <script>
- Strview.createView({
- el: "#app",
- data: {
- msg: 'Hello Strview.js'
- },
- template: `<p>{msg}</p>`,
- });
- </script>
- </body>
- </html>
- Hello Strview.js
條件渲染
只適用于初次渲染。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Strview.js</title>
- </head>
- <body>
- <div id="app"></div>
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
- <script>
- let isOk = false;
- Strview.createView({
- el: "#app",
- data: {
- msg: 'Hello Strview.js',
- isOk:false
- },
- template: `
- <p>{msg}</p>
- ${isOk ? `<span>hide</span>` : ''}
- `,
- });
- </script>
- </body>
- </html>
- Hello Strview.js
列表渲染
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Strview.js</title>
- </head>
- <body>
- <div id="app"></div>
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
- <script>
- let liNodes = ``;
- for (let index = 1; index < 3; index++) {
- liNodes += `<li>${index}</li>`
- }
- const app = Strview.createView({
- el: '#app',
- template: `<ul>${liNodes}</ul>`
- })
- </script>
- </body>
- </html>
- 1 2
事件處理
eventListener方法一共有三個(gè)參數(shù),分別是DOM節(jié)點(diǎn)、事件名稱、回調(diào)函數(shù)。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Strview.js</title>
- </head>
- <body>
- <div id="app"></div>
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
- <script>
- Strview.createView({
- el: "#app",
- data: {
- msg: 'Hello Strview.js',
- },
- template: `
- <p>{msg}</p>
- `,
- });
- Strview.eventListener('p', 'click', () => {
- console.log(1);
- });
- </script>
- </body>
- </html>
- 1
響應(yīng)性數(shù)據(jù)
ref
針對(duì)單一簡單屬性。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Strview.js</title>
- </head>
- <body>
- <div id="app"></div>
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
- <script>
- Strview.createView({
- el: "#app",
- data: {
- msg: 'Hello Strview.js',
- },
- template: `
- <p>{msg}</p>
- `,
- });
- Strview.eventListener('p', 'click', () => {
- Strview.ref().msg = 1;
- });
- </script>
- </body>
- </html>
reactive
針對(duì)復(fù)雜屬性。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Strview.js</title>
- </head>
- <body>
- <div id="app"></div>
- <script src="https://cdn.jsdelivr.net/npm/strview@1.8.0/dist/strview.global.js"></script>
- <script>
- Strview.createView({
- el: "#app",
- data: {
- obj: {
- a: 1,
- b: 2
- }
- },
- template: `
- <button class="btn1">change</button>
- <p>{obj.a}</p>
- <p>{obj.b}</p>
- `,
- });
- Strview.eventListener('.btn1', 'click', () => {
- Strview.reactive()['obj.a'] = 2;
- Strview.reactive().obj.b = 3;
- });
- </script>
- </body>
- </html>
部署
如果您使用strviewApp這個(gè)項(xiàng)目構(gòu)建工具,你可以這樣部署您的項(xiàng)目。
- npm run build
or
- yarn build
結(jié)語
以上就是Strview.js大概介紹了,需要改進(jìn)的地方肯定很多。寫出來也是為了拿出一點(diǎn)東西來,還有就是吸取大家的意見,讓自己可以更快地成長。
備注
以下是源碼地址:
- https://github.com/maomincoding/strview
- https://github.com/maomincoding/strview-app
- https://github.com/maomincoding/strview-cli
本文轉(zhuǎn)載自微信公眾號(hào)「前端歷劫之路」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系前端歷劫之路公眾號(hào)。