如何用过滤器显示原始html?
我有这样的事情:
K.json = function( json ) {
if( typeof json!='string' ) json = JSON.stringify( json, null, 2 );
json = json.replace( //g, '>' ); // replace(/&/g, '&')
var pattern = /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g;
var html = json.replace( pattern, function( match ) {
var cls = 'number';
var suffix = '';
if( /^"/.test( match ) ) {
if( /:$/.test( match ) ) {
cls = 'key';
match = match.slice( 0, -1 );
suffix = ':'
} else {
cls = 'string';
}
} else if( /true|false/.test( match ) ) {
cls = 'boolean';
} else if( /null/.test( match ) ) {
cls = 'null';
}
return '' + match + '' + suffix;
} );
return html;
};
Vue.filter( 'json', K.json );
并使用这样的东西:
它显示警告并显示错误:
vue.js:523 [Vue warn]: Property or method "json" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option.
(在根实例中找到)
我也试过论坛的解决方案:https://laracasts.com/discuss/channels/vue/use-a-filter-custom-filter-in-v-html-property?page = 1
它显示错误:
[Vue warn]: Error when rendering root instance: vue.js:3063 Uncaught TypeError: Cannot read property 'filters' of undefined at eval (eval at makeFunction (vue.js:8260),:2:2975) at Proxy.renderList (vue.js:3158) at Proxy.eval (eval at makeFunction (vue.js:8260), :2:2169) at Vue$3.Vue._render (vue.js:3054) at Vue$3. (vue.js:2430) at Watcher.get (vue.js:1661) at new Watcher (vue.js:1653) at Vue$3.Vue._mount (vue.js:2429) at Vue$3.$mount (vue.js:6000) at Vue$3.$mount (vue.js:8327)
在VueJS2上执行此操作的正确方法是什么?
为了完整起见,您有一些选择,例如:
v-html="$options.filters.FILTERNAME(args)"
要么
:inner-html.prop="args | FILTERNAME"
要么
v-html="METHODNAME(args)"
,如果你创建一个方法.
见下面的演示.
function json(text) {
// do your magic
return text.toUpperCase(); // just for demo
}
Vue.filter('json', function (value) {
return json(value);
})
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
},
methods: {
jsonMethod(v) {
return json(v); // create a "proxy" to the outer function
}
}
})
问题是在将过滤器添加到Vue实例之前已处理HTML。像这样尝试: JSFiddle
var jsonFormatter = function(json){
if( typeof json!='string' ) json = JSON.stringify( json, null, 2 );
json = json.replace( //g, '>' ); // replace(/&/g, '&')
var pattern = /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g;
var html = json.replace( pattern, function( match ) {
var cls = 'number';
var suffix = '';
if( /^"/.test( match ) ) {
if( /:$/.test( match ) ) {
cls = 'key';
match = match.slice( 0, -1 );
suffix = ':'
} else {
cls = 'string';
}
} else if( /true|false/.test( match ) ) {
cls = 'boolean';
} else if( /null/.test( match ) ) {
cls = 'null';
}
return '' + match + '' + suffix;
} );
return html;
}
new Vue({
el: '#app',
data(){
return {
jsonData: {dog: 'woof', nestedObject: {cat: 'meow'}}
}
},
filters: {
jsonFormatter: jsonFormatter
}
});
//Vue.filter( 'jsonFormatter', jsonFormatter ); // Doesn't work becuase happens after html is processed
v-html directive