【问题标题】:prettify json string vuejs2 webpack美化 json 字符串 vuejs2 webpack
【发布时间】:2018-01-14 08:04:16
【问题描述】:

我尝试将我的 json 字符串过滤成 JSON 高亮语法或有点像带有前置元素标签的 json 美化。我不想要一个树 json 查看器,只想要一个漂亮的 JSON 语法高亮。

模板

<div id="app">
  <pre>{{{ json | jsonPretty }}}</pre>
</div>

vue

var vm = new Vue({
  el: '#app',
  data() {
    return {
      json:'{ "name: "John Doe" }'
    }
  },
  filters: {
    jsonPretty: function(value) {
      let json = JSON.stringify(JSON.parse(value), null, 2)
      json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
      return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+]?\d+)?)/g, function(match) {
        var cls = 'number'
        if (/^"/.test(match)) {
          if (/:$/.test(match)) {
            cls = 'key'
          } else {
            cls = 'string'
          }
        } else if (/true|false/.test(match)) {
          cls = 'boolean'
        } else if (/null/.test(match)) {
          cls = 'null'
        }
        return '<span class="' + cls + '">' + match + '</span>'
      })
    }
  }
});

CSS

pre {
  outline: 1px solid #ccc;
  padding: 15px; 
  margin: 5px;
  background: white;
 }
.string { color: green; }
.number { color: darkorange; }
.boolean { color: blue; }
.null { color: magenta; }
.key { color: red; }

我尝试使用 jsfiddle,它正在工作,但是当我尝试使用 webpack 官方 vuejs 模板时,它显示错误

ERROR in ./~/vue-loader/lib/template-compiler?{"id":"data-v-4b8ecaca","hasScoped":true,"transformToRequire":{"video":"src","source":"src","img":"src","image":"xlink:href"}}!./~/vue-loader/lib/selector.js?type=template&index=0!./src/components/Hello.vue
(Emitted value instead of an instance of Error) 
  Error compiling template:

  <div class="hello">
    <div class="">

      <pre>{{{ json | jsonPretty }}}</pre>
    </div>
  </div>

  - invalid expression: {{{ json | jsonPretty }}}

 @ ./src/components/Hello.vue 10:2-300
 @ ./~/babel-loader/lib!./~/vue-loader/lib/selector.js?type=script&index=0!./src/App.vue
 @ ./src/App.vue
 @ ./src/main.js
 @ multi ./build/dev-client ./src/main.js

编辑:添加 jsfiddle 链接

https://jsfiddle.net/Ljck1wmL/5/

【问题讨论】:

  • Vue 实例的data 应该是一个函数。只有组件有这个要求
  • @Phil 它有 html 标签。我用特殊的类跨度标签包装了一些匹配的正则表达式字符串。所以我可以设计它。
  • 您在 JSFiddle 中使用 Vue v1。你在本地使用的是哪个版本的 Vue 和 vue-loader?
  • @Phil 我用户 vue 2 和 vue-loader ^12。我尝试用计算数据更改我的过滤器。它用特定的类解析 span 标签。但它不呈现风格。它与 vuejs 生命周期有关?

标签: javascript json webpack vuejs2


【解决方案1】:

我找不到任何关于 {{{ html }}} 语法的文档。根据official documentation,你应该使用v-html指令。

此外,Vue 2.x 过滤器仅在 mustache 和 v-bind 表达式中可用。 You cannot use a filter in v-html.

对于其他任何事情,您都应该使用计算属性或方法。

<pre v-html="prettyAreaData"></pre>

computed: {
  prettyAreaData: function() {
    var value = this.areaData;
    // and so on with the rest of your function

我已更新您的 JSFiddle 以使用 Vue 2.x,我假设您在本地使用它。我还将 data 函数修复为普通对象。

https://jsfiddle.net/Ljck1wmL/7/

【讨论】:

  • 我也尝试过计算数据和函数,但没有渲染 css。
  • 我不知道你说的“css not render”是什么意思。你的意思是你的 CSS 中的样式没有被应用?如果是这样,您的 CSS 是如何包含的?如果它在一个独立的组件中(例如Hello.vue),它应该在一个&lt;style&gt;标签中
  • 是的,我的意思是没有应用 css。我把所有的CSS都放在样式范围标签中
  • @IbnuHabibie,您应该使用浏览器的开发人员工具检查元素并找出未应用 CSS 的原因。
  • 我已将过滤器更改为方法并将 css 样式设置为全局。现在问题解决了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2016-04-13
  • 2020-09-17
  • 2019-12-16
相关资源
最近更新 更多