开发UI框架:Svelte版LAYUI(准备工作)
最近开始接触Svelte,感觉发现了一个新大陆。同时考虑到国内Svelte用得非常少,这么好的框架没什么人用,主要就是因为没有ui框架,于是决定借用别人的轮子造一个。这里选择了layui,比较经典的一款框架。由于时代的原因,很遗憾下架了,一些高手推出了vue版layui,这里自己决定来个Svelte版的。
个人非常喜欢layui就是喜欢改框架的一行调用方式,如layer.alert();layer.open()等等。而现在工程化后,很多年没见过一句话调用的框架了,我决定尽量让框架简单明了。
有点说大话了,刚接触Svelte,啥都不会呢。先常识性的学习吧,看看一些功能点如何处理的。
1、先尝试一下router。svelte-spa-router
router.js
import Index from './views/Index.svelte' import List from './views/List.svelte' import View from './views/View.svelte' export const routes = { '/':Index, '/List':List, // '/View/*':View '/View/:id/':View }
2、常规点:首页、列表、内容页
首页Index.svelte 体验一个onMount
<script> import { onMount } from 'svelte'; import views from './views.js'; views.init(); let title='Index' import Select from '../Select.svelte'; let options = [ { value: 1, text: '#0d0887' }, { value: 2, text: '#6a00a8' }, { value: 3, text: '#b12a90' }, { value: 4, text: '#e16462' }, { value: 5, text: '#fca636' } ]; let dom_node; let w=0; let h=0; let top=0; let left=0; onMount(() => { console.log(dom_node); console.log(dom_node.width); get_size(); }); function get_topleft(objLookingFor) { var posX = objLookingFor.offsetLeft; var posY = objLookingFor.offsetTop-dom_node.parentNode.scrollTop; var aBox = objLookingFor;//需要获得位置的对象 do { aBox = aBox.offsetParent; posX += aBox.offsetLeft; posY += aBox.offsetTop; } while( aBox.tagName != "BODY" ); console.log(posX,posY); } function get_size() { console.log('get_size'); w=dom_node.clientWidth; h=dom_node.clientHeight; top=dom_node.offsetTop; left=dom_node.offsetLeft; //w=w,h=h,top=top,left=left; console.log('get_size',w,h,top,left); //console.log(dom_node.offsetParent); get_topleft(dom_node); setTimeout(()=>{ get_size(); },500); } function new_list(list) { var list2=[]; for(var i in list) { list2.push(list[i]); list2.push(list[i]); } return list2; } function now_change(value) { console.error('change',value); } setTimeout(()=>{ options[0].value='11'; options=options; },3000); </script> <div class="my_div"> 常规布局(以中型屏幕桌面为例): <div class="layui-row"> <div class="layui-col-md9"> 你的内容 9/12 </div> <div class="layui-col-md3"> 你的内容 3/12 </div> </div> 移动设备、平板、桌面端的不同表现: <div class="layui-row"> <div class="layui-col-xs6 layui-col-sm6 layui-col-md4"> 移动:6/12 | 平板:6/12 | 桌面:4/12 </div> <div class="layui-col-xs6 layui-col-sm6 layui-col-md4"> 移动:6/12 | 平板:6/12 | 桌面:4/12 </div> <div class="layui-col-xs4 layui-col-sm12 layui-col-md4"> 移动:4/12 | 平板:12/12 | 桌面:4/12 </div> <div class="layui-col-xs4 layui-col-sm7 layui-col-md8"> 移动:4/12 | 平板:7/12 | 桌面:8/12 </div> <div class="layui-col-xs4 layui-col-sm5 layui-col-md4"> 移动:4/12 | 平板:5/12 | 桌面:4/12 </div> </div> </div> <div style="background:rgba(0,0,0,0.1); height:200px;"> page: {title} </div> <Select type="a" options={options} list={new_list(options)} on:testchange={now_change} ></Select> <Select type="b" options={options} list={new_list(options)} on:testchange={now_change} change={now_change}></Select> <div style="background:rgba(0,0,0,0.3);">{w}-{h},{top}-{left}</div> <div style="height:300px; overflow-y:auto;"> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <div bind:this={dom_node}> <span style="font-size: 20px">xxxxxxx</span> </div> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> </div> <style> .my_div {} .my_div .layui-row{ padding:10px ;} .my_div .layui-row div{ height: 60px;} .my_div .layui-row div:nth-child(even){ background:rgba(0,0,0,0.03);} .my_div .layui-row div:nth-child(odd){ background:rgba(0,0,0,0.08);} </style>
列表页 List.svelte 体验个数据变化
<script> import views from './views.js'; views.init(); let title='List' import xixi from '../../Xixi/Xixi.js'; xixi.render=function(){xixi.do_render=true;} import Xixi from '../../Xixi/Xixi.svelte'; let alert_num=0; xixi.alert('000'); views.setInterval(()=>{ alert_num++; xixi.alert('setInterval_'+alert_num); xixi.render(); },2000); views.setTimeout(()=>{ alert_num++; xixi.msg('setTimeout_'+alert_num); xixi.render(); },5000); </script> <div style="background:rgba(0,0,0,0.1); height:200px;"> page: {title} </div> <Xixi {...xixi.options}></Xixi> <style> </style>
内容页View.svelte 体验个参数传递
<script> import views from './views.js'; import {location, querystring} from 'svelte-spa-router' import {parse} from 'qs' console.log($location); console.log($querystring); console.log(parse($querystring)); views.init(); export let params = {}; let title='View' console.log('params',params); </script> <div style="background:rgba(0,0,0,0.1); height:200px;"> page: {title}-{JSON.stringify($location)} <button type="button" class="layui-btn">一个标准{params.id}</button> <a href="#/List" class="layui-btn">一个可跳转的按钮</a> </div> <style> </style>
直接引入layui.css,测了一下,跟自己想的还是比较接近的,只是Svelte确实有一些坑,比较明显的就是数据更新,自己也在想办法去解决,后面正式开发框架的时候再慢慢摸索吧,感觉还是比较有信心的。