数据双向绑定的两种方式

proxy数据代理

 let inp = document.getElementById('inp')
    let oDiv = document.getElementById('box')
    let elems = [inp,oDiv]

    let obj = {
        value:'这是obj的初始值'
    }


    function initVal(obj) {
        if (typeof obj!='object') throw new Error('obj is not object')
        for (let i=0;i<elems.length;i++){
            let elem = elems[i]
            let attrs = elem.attributes
            for (let i=0;i<attrs.length;i++){
                if (attrs[i].nodeName.indexOf('data')>-1){
                    let prop = attrs[i].nodeName.slice(5)
                    prop = prop == 'innerhtml' ? 'innerHTML' : prop
                    let propVal = attrs[i].nodeValue
                    elem[prop] = obj[propVal]
                }
            }
        }
    }

    //初始化数据
    initVal(obj)

    //数据代理
    let proxy = new Proxy(obj,{
        get(target, p, receiver) {
            return target[p]
        },
        set(target, p, value, receiver) {
            target[p] = value
            initVal(target)
        }
    })

    inp.addEventListener('input',function () {
        proxy.value = this.value
    })

Object.defineproperty()劫持数据

<script>

    let obj = {msg:'hello world'}
    function getEleById(id) {
        return document.getElementById(id)
    }
    let inp = getEleById('inp')
    let p = getEleById('p')
    let elems = [inp,p]

    function initVal(obj) {
        elems.forEach(function (item, index) {
            let attrs = item.attributes
            for (let i = 0, len = attrs.length; i < len; i++) {
                if(attrs[i].nodeName.indexOf('data')>-1){
                    let prop = attrs[i].nodeName.slice(5)
                    prop = prop == 'innerhtml'?'innerHTML':prop
                    let propVal = attrs[i].nodeValue
                    item[prop] = obj[propVal]
                    console.log(propVal)
                    console.log(prop)
                    console.log(attrs[i])
                }
            }

        })

    }
    //初始化数据
    initVal(obj)

    //数据劫持
    let newObj = {}
    Object.defineProperty(newObj,'msg',{
        get(){
            return obj.msg
        },
        set(val){
            obj.msg =  val;
            initVal(obj)
        }
    })

    inp.addEventListener('input',function(){
        newObj.msg = this.value
        console.log(123)
    })

</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值