属性指令的解析原理——以 v-if 为例

问题提出

面试中,面试官不免要问,关于v-if这类的指令,实现的原理是什么?

效果图示:

HTNL:

<body>
<div id="root">
    <div v-if="true">我是指令的展示和隐藏</div>

    <div v-if="false">我是要隐藏的</div>
</div>
</body>

我们期望在界面上,展示的效果是这样的:
这里写图片描述

如何实现

//第一步:获取元素DOM节点
var el = document.getElementById('root');
//第二步:处理DOM
function dealNode(el) {
    var childNodes = el.childNodes;
    [].slice.call(childNodes).forEach((node)=>{

        if(node.nodeType == 1){
            //节点元素的属性
            var nodeAttrs = node.attributes;
            console.log(nodeAttrs);
            [].slice.call(nodeAttrs).forEach((attr) => {
                var attrName = attr.name;
                if(isDeretive(attrName)){
                    var exp = attr.value;
                    var dir = attr.name.substring(2);
                    console.log('指令类型',dir);
                    console.log('指令的值',exp);
                    if(dir == 'if' && (exp=='false')){

                        node.parentNode.removeChild(node);
                    }
                }
            });
        }

        //节点深层遍历
        if(node.childNodes && node.childNodes.length){
            dealNode(node);
        }
    })
}
dealNode(el);

function isDeretive(attr) {
    return attr.indexOf('v-') == 0;
}

完整实例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>属性指令</title>
</head>
<body>
<div id="root">
    <div v-if="true">我是指令的展示和隐藏</div>

    <div v-if="false">我是要隐藏的</div>
</div>
</body>
<script>
    var el = document.getElementById('root');
    function dealNode(el) {
        var childNodes = el.childNodes;
        [].slice.call(childNodes).forEach((node)=>{

            if(node.nodeType == 1){
                var nodeAttrs = node.attributes;
                console.log(nodeAttrs);
                [].slice.call(nodeAttrs).forEach((attr) => {
                    var attrName = attr.name;
                    if(isDeretive(attrName)){
                        var exp = attr.value;
                        var dir = attr.name.substring(2);
                        console.log('指令类型',dir);
                        console.log('指令的值',exp);
                        if(dir == 'if' && (exp=='false')){

                            node.parentNode.removeChild(node);
                        }
                    }
                });
            }


            if(node.childNodes && node.childNodes.length){
                dealNode(node);
            }
        })
    }
    dealNode(el);

    function isDeretive(attr) {
        return attr.indexOf('v-') == 0;
    }
</script>
</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值