【问题标题】:VueJS - Interpolate a string within a stringVueJS - 在字符串中插入字符串
【发布时间】:2018-08-28 16:38:16
【问题描述】:

在 VueJS 中,有没有办法在模板或脚本中插入字符串 within 字符串?例如,我希望以下内容显示 1 + 1 = 2 而不是 1 + 1 = {{ 1 + 1 }}

<template>
    {{ myVar }}
</template>

<script>
    export default {
        data() {
            "myVar": "1 + 1 = {{ 1 + 1 }}"
        }
    }
</script>

编辑:为了更好地说明我为什么需要这个,这是我的实际数据的样子:

section: 0,
sections: [
    {
        inputs: {
            user: {
                first_name: {
                    label: "First Name",
                    type: "text",
                    val: ""
                },
                ...
            },
            ...
        },
        questions:  [
            ...
            "Nice to meet you, {{ this.section.inputs.user.first_name.val }}. Are you ...",
            ...
        ]
    },
    ...
],

this.section.inputs.user.first_name.val 将由用户定义。虽然我可以将问题属性重建为计算属性,但我宁愿保持现有数据结构完整。

【问题讨论】:

  • "myVar": "1 + 1 = "+(1+1)?但为什么?您可能以错误的方式接近它,告诉我们您想要实现的实际目标,可能会有更好的方法。
  • 我没有很好地解释情况。我有一个复杂的数据结构,其中变量是通过引用其他变量来构建的,例如包含用户名的句子。我正在尝试避免必须对模板中的每个句子进行硬编码的情况,例如&lt;p&gt;Hello, {{ user.first_name }}&lt;/p&gt; 并正在寻找一种解决方案来允许这样做:&lt;p&gt;{{ sentence }}&lt;/p&gt;,其中句子 = Hello, {{ this.user.first_name }}
  • 酷,做这种事情的正确方法是使用computed properties
  • 谢谢。这通常对我有用,但在我的特殊情况下,我需要先评估引用子变量的字符串,然后再计算父变量。我发布了一个适合我的解决方案。
  • “计算父变量之前的子变量” - 你能进一步解释一下吗?我无法理解这里的父母和孩子。

标签: variables vuejs2 eval bind string-interpolation


【解决方案1】:

我从https://forum.vuejs.org/t/evaluate-string-as-vuejs-on-vuejs2-x/20392/2 找到了我正在寻找的解决方案,它提供了一个关于 JsFiddle 的工作示例:https://jsfiddle.net/cpfarher/97tLLq07/3/

<template>
    <div id="vue">
        <div>
            {{parse(string)}}
        </div>
    </div>
</template>

<script>
    new Vue({
        el:'#vue',
        data:{
            greeting:'Hello',
            name:'Vue',
            string:'{{greeting+1}} {{name}}! {{1 + 1}}'
        },
        methods:{
            evalInContext(string){
                try{
                    return eval('this.'+string)
                } catch(error) {
                    try {
                        return eval(string)
                    } catch(errorWithoutThis) {
                        console.warn('Error en script: ' + string, errorWithoutThis)
                        return null
                    }
                }
            },
            parse(string){
                return string.replace(/{{.*?}}/g, match => {
                    var expression = match.slice(2, -2)
                    return this.evalInContext(expression)
                })
            }
        }
    })
</script>

【讨论】:

  • 我不认为它会支持string:'{{greeting+name}}
  • 您能否提供您的实际用例,因为我想知道计算属性在哪里失败?在此处显示的案例中,一个简单的计算属性似乎完全可以胜任。
  • 这个解决方案对我有用。我用一个更深入的例子来扩展我的问题,说明我的数据结构是什么样的。
  • 这个解决方案很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2011-10-19
  • 2021-05-01
  • 2020-08-20
相关资源
最近更新 更多