VueJS отображать свойство внутри html строки, используя v- html - PullRequest
2 голосов
/ 17 января 2020

Editor Content

У меня есть строка html, полученная из редактора и сохраненная в базе данных.

<h3><a href="#" rel="noopener noreferrer nofollow"><em><strong>Profile Of User:</strong></em></a></h3><p></p><p>{{user}}</p>

Я хочу получить его из базы данных и отобразить как HTML. когда я использую v- html, он будет отображаться как:

<v-card-text v-html="content"></v-card-text>

Профиль пользователя:

{{user}}

Как отобразить {{hello}} из свойства данных, если у меня есть свойство данных, подобное этому:

data() {
        return {
            user: "Lim Socheat",
            content:"<h3><a href="#" rel="noopener noreferrer nofollow"><em><strong>Profile Of User:</strong></em></a></h3><p></p><p>{{user}}</p>"
        };
    },

Ожидаемый результат:

Профиль пользователя:

Lim Socheat

, потому что {{user}} будет отображаться как Lim Socheat

Ответы [ 2 ]

5 голосов
/ 17 января 2020

Сделать контент вычисляемым свойством. А затем используйте его следующим образом:

  computed: {
    content() {
       return '<h3><a href="#" rel="noopener noreferrer nofollow"><em><strong>Profile Of User:</strong></em></a></h3><p></p><p>' + this.user + '</p>';
    }
  }

Таким способом можно использовать все переменные, определенные в данных.

Обновление: Поскольку OP получает HTML Строка из бэкэнда, они должны заменить переменные в этом случае. Мы сохранили карту всех переменных, которые могут появиться, и затем мы динамически создаем регулярное выражение для замены указанного ключа из кода.

  computed: {
    content() {
      // keep a map of all your variables
      let valueMap = {
        user: this.user,
        otherKey: 250
      };
      let value = '<h3><a href="#" rel="noopener noreferrer nofollow"><em><strong>Profile Of User:</strong></em></a></h3><p></p><p>{{user}}</p>';
      let allKeys = Object.keys(valueMap);
      allKeys.forEach((key) => {
        var myRegExp = new RegExp('{{' + key + '}}','i');
        value = value.replace(myRegExp, valueMap[key]);
      });
      return value;
    }
  }
1 голос
/ 17 января 2020

Я нашел ответ. надеюсь, это поможет кому-то в будущем.

Оригинальный пост: https://forum.vuejs.org/t/evaluate-string-as-vuejs-on-vuejs2-x/20392/2

VueJS - интерполировать строку внутри строки

 <template>
        <v-container>
            <v-card>
                <v-card-title>Print</v-card-title>
                <v-divider></v-divider>
                <v-card-text v-html="parse(content)"></v-card-text>
            </v-card>
        </v-container>
    </template>

    <script>
    export default {
        data() {
            return {
                hello: "HELLO DATA",
                user: "Lim Socheat",
                content: ""
            };
        },

        methods: {
            getLayout() {
                this.$axios
                    .$get("/api/layout/reciept", {
                        params: {
                            type: "reciept"
                        }
                    })
                    .then(response => {
                        this.content = response.content;
                    })
                    .catch(error => {
                        this.$toast.error(error);
                    });
            },

            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);
                });
            }
        },

        computed: {
            id() {
                return this.$route.params.id;
            }
        },

        watch: {
            id: {
                handler() {
                    this.getLayout();
                },
                immediate: true
            }
        }
    };
    </script>
...