美文网首页es6 JavaScript
es6- Proxy 结合原生js/或jQuery实现vue的数

es6- Proxy 结合原生js/或jQuery实现vue的数

作者: 小宝薯 | 来源:发表于2018-04-24 16:04 被阅读436次

点击查看基础Proxy认知

这篇我们集中如何使用js实现类似vue的简单数据双向绑定;

拿input和textarea两个html标签作为展示

show.gif
two-way data binding

一、html

<input type="text" id="inputName" />
<textarea name="haha" id="myArea" cols="30" rows="10">hello world</textarea>

二、js代码

Proxy: target -- handler -- traps
//创建一个对象
 const myUser = {
     id:'inputName',
     name:''  //用来存储和更新input的value值
 };
//第一步:当用户改变input输入值时更新myUser.name ,通过onchange事件处理程序来实现
inputChange(myUser);
function inputChange(myObject) {
    if (!myObject || !myObject.id) return;  //如果传入的对象不存在或者没有id属性,return出去
    const input = document.getElementById(myObject.id); //通过对象里的id从而获取对应id的input标签
    input.addEventListener('onchange', function(e) {
        myObject.name = input.value;
    });
}
//第二步:在js代码中修改myUse.name时,跟新input里的内容,这一步略微复杂,但是proxy代理提供了一个解决方案
    const inputHandler = {
     set:function (target,prop,newValue) {
         if(prop =='name' && target.id ) { //prop指的是传入的对象里的属性:
             //更新对象的属性
            target[prop] = newValue;
            document.getElementById(target.id).value = newValue;
            return true;  //set方法返回值只有false或true;
         }
         else return false;
     }
    };
 //创建proxy
    const myUserProxy = new Proxy(myUser,inputHandler);

一、测试:

//手动设置一个新的名字:
    myUserProxy.name = 'Lily';
    console.log(myUserProxy.name);  //Lily
    console.log(document.getElementById('inputName').value);  //Lily
预览: 静态.png

二、方案1:原生js实现数据绑定

  • oninput事件可以监听框的value变化
  • 为了实现实时,先将数据绑定提取出来成单独的函数,这样每次oninput事件触发就调用一次getChange,
var myArea = document.getElementById('myArea');
//初始textarea的值先给input框
var input = document.getElementById('inputName');
input.value = myArea.value;
function getChange() {
    myUserProxy.name =myArea.value;
    console.log(myUserProxy.name);  //Lily
    console.log(document.getElementById('inputName').value);  //Lily
}
myArea.oninput = function () {
    getChange()
}

三:方案2:jQuery实现数据绑定

  • 记得先引入jquery库
  • 为了实现实时,使用setTimeout间歇调用触发keydown事件
$("#myArea").keydown(function () {
    myUserProxy.name = $("#myArea").val();
    console.log(myUserProxy.name);  //Lily
    console.log(document.getElementById('inputName').value);  //Lily
});
setTimeout(function () {
    $("#myArea").trigger('keydown')
},100);

相关文章

网友评论

    本文标题:es6- Proxy 结合原生js/或jQuery实现vue的数

    本文链接:https://www.haomeiwen.com/subject/wldjlftx.html