简易响应式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <label for="name">Name (4 to 8 characters):</label>
    <input type="text" id="name" name="name" required minlength="4" maxlength="8" size="10" />
    <span id="value"></span>

    <script>
        const bucket = new Set()
        const data = {}
        const result = new Proxy(data, {
            set(target, prop, value) {
                target[prop] = value;
                console.log('set value')
                bucket.forEach((fn) => fn());
                return true;
            },
            get(target, prop) {
                bucket.add(handleSetValue);
                console.log('get value')
                return target[prop];
            }
        })
        const input = document.getElementById("name");
        input.addEventListener("input", function(event) {
            result.name = event.target.value; // 触发set操作, 执行bucket里的副作用函数
            console.log("input changed")
        });

        const value = document.getElementById("value");
        function handleSetValue() {
            value.innerHTML = result.name + '!';
            console.log("value changed")
        }

        function init() {
            console.log(result.name) // 调用一下Proxy的get方法, 收集副作用函数
        }

        init()
    </script>
</body>
</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值