开发UI框架:Svelte版LAYUI(准备工作)

野生程序猿-杂烧3年前案例分享2029

最近开始接触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>

image.png


直接引入layui.css,测了一下,跟自己想的还是比较接近的,只是Svelte确实有一些坑,比较明显的就是数据更新,自己也在想办法去解决,后面正式开发框架的时候再慢慢摸索吧,感觉还是比较有信心的。


标签: Sveltelayui

相关文章

推荐一个前端框架Svelte(超级轻量级)

现在的前端框架太多了,国内用得比较多的是vue,非常强大,但是个人感觉灵活性糟糕,代码比较繁琐。近期接触一个框架,顿时让我感觉非常的爽,一种似曾相似的感觉,这个框架就是Svelte。Svelte是一个...

开发UI框架:Svelte版LAYUI(栅格系统与后台布局)

开发UI框架:Svelte版LAYUI(栅格系统与后台布局)

跟着layui官方的思路来,先是框架的css部分,这部分基本照搬过来。先前已经研究过了直接可以加载layui.csspublic/index.html<!DOCTYPE html>...

开发UI框架:【laylte】Svelte版LAYUI(表单 - 单选框)

开发UI框架:【laylte】Svelte版LAYUI(表单 - 单选框)

【laylte/LayRadio.svelte】<script>     //import { createEventDisp...

开发UI框架:【laylte】Svelte版LAYUI(表单 - 开关)

开发UI框架:【laylte】Svelte版LAYUI(表单 - 开关)

【laylte/LaySwitch.svelte】<script>     //import { createEventDis...

开发UI框架:【laylte】Svelte版LAYUI(缓一下,继续钻研一下填填坑)

开发UI框架:【laylte】Svelte版LAYUI(缓一下,继续钻研一下填填坑)

接下来准备做全局的方法了,象弹窗,还是希望尽量做到一句话调用。layui的弹窗组件里有一个tips功能,把我难住了。感觉这个jquery比较容易实现。有这样一个场景,滚动的页面里如果有tips功能,需...

开发UI框架:Svelte版LAYUI(按钮)

开发UI框架:Svelte版LAYUI(按钮)

App.svelte<script>     //export let name; </script> <...