(共566篇)
全部分类

vue中如何在v-html指令中使用过滤器
[ Vue(2+3) ] 

在 vue 和 angularJs 中使用过滤器是很频繁的事情,尤其是像本博客中的实时编译 markdown 语法,更是一个很大的功能点,angularJs 中是可以对自定义指令 ng-bind-html 使用过滤器的,但是 vue2 版本以上不再允许 v-html 指令使用过滤器,那么该怎么做呢?

先回忆一下 angularJS 中如何定义和使用过滤器

假设我们已经在 html 中引入了 showdown.js 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
angular.module('app').filter('showdown', filter);
function filter(data) {
    return function (data) {
        (converter = new showdown.Converter({
            tables: true,
            underline: true,
            strikethrough: true,
        })),
            (html = converter.makeHtml(data));
        return $sce.trustAsHtml(html);
    };
}

在 html 中的用法

1
<div ng-bind-html="content | showdown"></div>

那么在 vue 中该如何实现这个效果呢?

首先在 vue 文件中引入 showdown

1
import { showdown as ShowDown } from 'showdown.js';

仔细看过 showdown 源码的应该会知道,showdown 里面已经针对 AMD、CommonJS、Regular 做了分别的而处理,可以允许我们以 import 的方式引入他的模块,而我们要用的 showdown 只是他 export 出来的对象中的一个方法,因此我们在 import 的时候,使用了对象解构的语法(对象解构请看阮一峰老师的 ES6 详解)

现在我们来解决 vue 的 v-html 指令不能使用过滤器的问题。

v-html 指令实际上指向了一个表达式,所以我们完全可以在他的值中使用类似于&showdown(data)&的方式,来绑定显示的内容,这就意味这我们需要在 methods 中定义一个专门的方法,代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
export default {
    methods: {
        showdown(data) {
            let converter = new ShowDown.Converter({
                tables: true,
                underline: true,
                strikethrough: true,
            });
            let html = converter.makeHtml(data);
            return html;
        },
    },
};

在 html 中的用法

1
<div v-html="showdown(content)"></div>