Vue中,数据绑定视图的实现原理

本文介绍了一个简单的Vue数据绑定实现过程,通过正则表达式匹配文本节点中的{{}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例

比如说,在body中的数据模板是这样的:

<body>
    <div id="root">
        <div>{{message}}</div>
    </div>
</body>

而message的值在数据中是这样表示的:

var data = {
    message: 'hello world'
};

那么在界面中如何让它显示hello world呢?

实现原理讲解

核心原理非常简单,就是使用正则判断文本节点的 {{ }} 的问题。

第一步:

//第一步,获取入口节点,并且创建一个文档碎片。
var $el = document.querySelector('#root');
 //console.log($el);
 var fragment = document.createDocumentFragment();
 fragment.appendChild($el);
 //console.log(fragment);

第二步:

function isTextNode(node) {
    return node.nodeType == 3;
}
function compileElement(fragment) {
    var childNodes = fragment.childNodes;
    [].slice.call(childNodes).forEach(function (node) {

        var text = node.textContent;
        var reg = /\{\{(.*)\}\}/;


        if(node.childNodes && node.childNodes.length){
            compileElement(node)
        } else if(isTextNode(node) && reg.test(text)) {
            //console.log('底层文本解析',RegExp.$1);
            let thisText = data[RegExp.$1];
            node.textContent = thisText;
        }
    });
    //console.log('最终的fragment',fragment)
    return fragment;
}
var mycompile = compileElement(fragment);

第三步:

document.body.appendChild(mycompile);

完整的代码演示示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue指令解析过程</title>
</head>
<body>
    <div id="root">
        <div>{{message}}</div>
    </div>
</body>
<script>
    var data = {
        message: 'hello world'
    };

    //第一步,获取入口节点,并且创建一个文档碎片。
    var $el = document.querySelector('#root');
    //console.log($el);
    var fragment = document.createDocumentFragment();
    fragment.appendChild($el);
    //console.log(fragment);


    //第二步,遍历解析

    function compileElement(fragment) {
        var childNodes = fragment.childNodes;
        [].slice.call(childNodes).forEach(function (node) {

            var text = node.textContent;
            var reg = /\{\{(.*)\}\}/;


            if(node.childNodes && node.childNodes.length){
                compileElement(node)
            } else if(isTextNode(node) && reg.test(text)) {
                console.log('底层文本解析',RegExp.$1);
                let thisText = data[RegExp.$1];
                node.textContent = thisText;
            }
        });
        //console.log('最终的fragment',fragment)
        return fragment;
    }
    var mycompile = compileElement(fragment);
    console.log(mycompile);
    document.body.appendChild(mycompile);


    function isTextNode(node) {
        return node.nodeType == 3;
    }

</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值