简单实现Vue中的插值替换(一)

81 篇文章 7 订阅

简单实现Vue中的插值替换(一)

这篇博客,我们简简单单的实现一下Vue中插值替换的功能。

当然,功能肯定是简化简化再简化的了,只有这样才能称为——简简单单 0^0。

正片开始:

要点解释:0v0

  • 首先我们要知道什么插值替换,这个想必学过Vue的都知道,这里就简单说一下:

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

    这段 HTML 代码中,{{}} 双大括号语法就是插值语法。

    插值替换:就是把双大括号包括的变量替换成我们定义的真正的值。

    • 我们都知道在Vue中,代码是这样的:

      <body>
      	<div id="root">
      		<p>{{name}} - {{message}}</p>
      	</div>
      </body>
      <script src="../xxxx/vue.js"></script>
      <script>
          let app = new Vue({
              el:'#root',
              data(){
                  return {
                      name: 'Youwillsun',
                      message: '这是我的博客'
                  }
              }
          })
      </script>
      

      运行这段代码,vue就会把我们写的 {{name}} {{mesage}} 替换成 Youwillsun - 这是我的博客这段我们定义的文字。

      这次我们就是简单的实现这个功能。

思路分析:0v0

  1. 定义一个对象,这是我们的数据源,类比 Vue 中的 data 。

    let data = {
        name: 'Youwillsun',
        message: '这是我的博客'
    };
    
  2. 定义一个模板,这是里面是被替换的内容,其实就是 dom。

    <div id="root">
        <p>{{name}} - {{message}}</p>
        <p>{{name}}</p>
        <p>{{message}}</p>
    </div>
    
  3. 获取dom元素,然后找到里面写插值表达式的地方【ps:找插值表达值也就找 {{}} ,这里使用一下正则表达式匹配】

    let regx = /\{\{(.+?)\}\}/g; // 正则表达式匹配双花括号
    
    let tmpNode = document.querySelector('#root');// 获取dom
    

    找到了之后用数据源里的数据替换,使用 replace 替换就好了。

  4. 把处理好的dom替换原来的dom,这样就完成了。


注意:Vue 里不是这么干的,我们只是为了简单实现插值替换的功能,所以才会把整个DOM进行替换。


代码实现:0v0

<!-- dom -->
<body>
    <div id="root">
        <p>{{name}} - {{message}}</p>
        <p>{{name}}</p>
        <p>{{message}}</p>
    </div>
</body>
<!-- js -->
<script>
    console.log(root);

    let regx = /\{\{(.+?)\}\}/g; // 正则表达式匹配双花括号

    let tmpNode = document.querySelector('#root');

    let data = {
        name: 'Youwillsun',
        message: '这是我的博客'
    };

    // 定义编译函数,用来处理dom元素
    function complier(template, data) {
        // 获取子节点
        let childNodes = template.childNodes;
        // 遍历子节点
        for (let i = 0; i < childNodes.length; i++) {
            // 根据子节点类型,来确定此节点是文本节点,还是元素节点[3代表文本节点,1代表元素节点]
            let type = childNodes[i].nodeType;
            if (type === 3) {
                // 获取文本节点的值
                let txt = childNodes[i].nodeValue;
                // 利用replace,结合正则表达式,来对插值进行替换
                txt = txt.replace(regx, function (_, g) {
                    let key = g.trim();
                    let value = data[key];
                    return value;
                });
                childNodes[i].nodeValue = txt;
            } else if (type === 1) {
                // 如果是元素节点 递归调用
                complier(childNodes[i], data);
            }
        }
    }

    let generateNode = tmpNode.cloneNode(true);
    complier(generateNode, data);
    // 替换原来的dom模板
    root.parentNode.replaceChild(generateNode, root);

    console.log(root);
</script>

代码解释:0v0

  1. 首先看代码中的console.log(root)有些人就懵了,root 是什么?

    root 就是 dom元素中 div 的 id,这点有兴趣的人可以尝试一下,我们在 js 中可以直接输出 dom 定义某个 id 值的模板。

  2. 接着就是定义的编译函数了,注释写的很清楚了,我挑解释一下:

    • 第一个点:nodeType是什么?

      nodeType 顾名思义就是节点的类型:

      • 元素节点:可以简单的理解成,此节点还有子节点。
      • 文本节点:可以简单的理解成,此节点没有子节点了,这个节点是填充文本的,是我们编写内容的地方。

      具体了解,可一看这个网址:HTML DOM nodeType 属性

    • 第二个点:replace函数

      replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串 。

      具体了解可以看:replace用法解释

  3. 可以看到我用了一个 cloneNode 先克隆了一下模版,然后把克隆的模板交给 complier 进行处理的

    • 这也是稍稍向Vue靠拢一下,毕竟任何时候,我们都不能拿到什么就都直接处理
    • 一般情况下,都要考虑是否要进行备份,这里也是一样的,先对原模板进行备份。
  4. 然后利用replaceChild函数,传入要替换的 dom 和 被替换的 dom。


到这里就结束了,这就简单实现了Vue中的插值替换。

下一篇:简单实现Vue中的插值替换(二)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Vue3插值表达式的换行符(\n)会被保留并输出。这意味着如果你在插值表达式添加了换行符,那么它们会被识别并在渲染时输出到页面。 例如,如果你有以下代码: ``` <template> <div> {{ message }} </div> </template> <script> export default { data() { return { message: 'Hello\nWorld' } } } </script> ``` 则渲染后的结果将是: ``` <div> Hello World </div> ``` 注意,这种行为只适用于单个插值表达式的换行符。如果你在模板使用多个插值表达式或其他语法,则可能需要使用模板字面量或其他技术来处理多个换行符。 ### 回答2: Vue3的插值表达式仍然可以识别,与Vue2相比,在Vue3插值表达式的语法没有发生重大变化。插值表达式可以用于将数据动态绑定到HTML模板。 在Vue3插值表达式仍然使用双大括号"{{}}"来包裹表达式。在HTML模板,可以在双大括号内部写入JavaScript表达式,用于动态生成HTML内容。Vue会根据表达式的值自动更新DOM。 例如,在Vue3的模板可以使用插值表达式来显示一个变量的值: ```html <div> {{ message }} </div> ``` 上述代码,双大括号的"message"是一个变量,它会被动态地替换为其对应的值,并显示在div元素。 同时,插值表达式也支持JavaScript表达式的使用,可以在插值表达式进行计算或者调用方法: ```html <div> {{ count + 1 }} </div> <div> {{ getName() }} </div> ``` 上述代码,第一个插值表达式用于计算count加1的结果,并将结果显示在div元素。第二个插值表达式调用了一个名为getName的方法,并将其返回值显示在div元素。 综上所述,Vue3的插值表达式仍然可以识别,并且可以通过双大括号在HTML模板动态地绑定数据和执行JavaScript表达式。 ### 回答3: Vue 3插值表达式在一定程度上有所变化。与Vue 2不同,Vue 3插值表达式不再支持多行文本。也就是说,在插值表达式使用/n是不会被识别和渲染的。 Vue 3的插值表达式仍然使用双大括号{{}}包裹要求处理的数据。但与Vue 2不同的是,插值表达式不能跨越多行。如果在插值表达式使用了/n,Vue 3会将其视为纯文本,并不会将其解析为换行符。 要在Vue 3实现多行文本的渲染,可以使用<p>、<div>等HTML元素结构,或者使用v-html指令进行渲染。例如,可以在组件定义一个data属性,存储包含换行符的文本,然后使用v-html指令将其渲染为HTML。 总结而言,Vue 3的插值表达式不支持识别/n,如果需要实现多行文本渲染,可以使用其他方式如HTML元素结构或者v-html指令来处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值