infinnie / infinnie.github.io

https://infinnie.github.io/
Apache License 2.0
0 stars 1 forks source link

More component API? #17

Open infinnie opened 4 months ago

infinnie commented 4 months ago
import { h, watch, mounted, willUnmount, provide, consume } from '[[lib-name]]';
import request from '[[ajax-lib-name]]';

export default function (props, { update, emit }) {
    let initProps = props();

    let local = 1;
    let lock = null;
    let nextTask = null;
    let marker = null;

    let list = [];

    const constantProvider = provide('contextConstant', 666);
    const provideContext = provide('contextValue', local);
    const consumeContext = consume('outerContextValue');

    const handleClick = function (e) {
        emit('click', e);
    }
    const increase = function () {
        local++;
        provideContext(local);
        update();
    }

    function processRequest(value) {
        marker = value;
        // process some web request
        console.log('dependency was changed');

        async function next() {
            const resp = await request('/some-api', {
                contextValue: consumeContext(),
                propValue: props().propName,
                localValue: local
            });
            if (marker === value) {
                list = resp.list;
                update();
            }
        }

        if (lock) {
            nextTask = next;
            return;
        }

        lock = setTimeout(() => {
            lock = null;
            if (nextTask) {
                nextTask();
                nextTask = null;
            }
        }, 500);

        next();
    }

    mounted(() => {
        processRequest(consumeContext() + initProps.propName);
    });

    watch(() => {
        const curProps = props();
        return consumeContext() + curProps.propName;
    }, processRequest);

    willUnmount(() => {
        if (lock) {
            clearTimeout(lock);
        }
    });

    return () => {
        const curProps = props();
        return <p $click={handleClick} class="clickable">{curProps.render({ increase, list })}</p>
    };
}