美文网首页Vue框架我爱编程
Vue如何动态渲染html

Vue如何动态渲染html

作者: 阿布ccc | 来源:发表于2017-11-02 18:01 被阅读0次
    Vue
    大家在使用Vue时,一般使用{{ Mustache }}或者v-text进行插值,对此,官方给出的解释是:

    数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:
    <span>Message: {{ msg }}</span>
    Mustache 标签将会被替代为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。
    通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上所有的数据绑定:
    <span v-once>这个将不会改变: {{ msg }}</span>

    但是在项目中,经常会遇到的情况是后台传给前端的数据不是单纯的字符串,而是html代码,比如资讯类的项目,需要我们将html代码渲染到页面中,{{mustache}}或者v-text会把html代码当做纯文本渲染出来,类似效果是这样的:

    渲染失败
    对于这种情况,官方给出的解决方法是使用v-html,官方解释如下:

    双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML ,你需要使用 v-html 指令:
    <div v-html="rawHtml"></div>
    这个 div 的内容将会被替换成为属性值 rawHtml,直接作为 HTML——会忽略解析属性值中的数据绑定。注意,你不能使用 v-html 来复合局部模板,因为 Vue 不是基于字符串的模板引擎。反之,对于用户界面 (UI),组件更适合作为可重用和可组合的基本单位。

    实验证明,这种方法真的很管用。

    但是,这次我在项目中遇到的问题是,后台传给我的数据是经过转义后的html数据,格式如上图所示,v-html只能渲染<span>this is span!</span>这种形式的html代码,对于转义过的代码无法渲染。这时候,我们就要将转义过的html代码通过vue的filter(过滤器)转义成为普通html代码。

    过滤器

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。
    过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。
    过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示:

    <!-- 在双花括号中 -->
    {{ message | capitalize }}
    
    <!-- 在 `v-bind` 中 -->
    <div v-bind:id="rawId | formatId"></div>
    
    filters: {
      capitalize: function (value) {
        if (!value) return ''
        value = value.toString()
        return value.charAt(0).toUpperCase() + value.slice(1)
      }
    }
    

    我们需要定义一个filter,用于将转义过的? < > / \等符号转义回来:

     filters: {
            unescape:function (html) {
                return html
                    .replace(html ? /&(?!#?\w+;)/g : /&/g, '&amp;')
                    .replace(/&lt;/g, "<")
                    .replace(/&gt;/g, ">")
                    .replace(/&quot;/g, "\"")
                    .replace(/&#39;/g, "\'");
            }
        }
    

    然后在需要渲染值的地方,使用该filter:

     <div class="content" v-html="product.content | unescape"></div>
    

    此时渲染出来的页面如图:


    渲染成功

    大功告成( ⊙ o ⊙ )!

    PS:由于过滤器是一个函数,所以过滤器可以接受参数。在{{ message | filterA('arg1', arg2) }}中,filterA被定义为接收三个参数的过滤器函数。其中 message的值作为第一个参数,普通字符串 arg1 作为第二个参数,表达式 arg2 的值作为第三个参数。`

    相关文章

      网友评论

        本文标题:Vue如何动态渲染html

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