ユーザーがショートコードを含むテキストを入力できる管理領域にフォームがあります。
[温度 c=200] でオーブンを加熱します。
私が望むのはtemp
、フロントエンドに表示されるときにショートコードが解析され、Vue 2 コンポーネントに変換されることです。
単純化されたTemperature.vue
コンポーネントを次に示します。
<template>
<span class="temperature">
{{ celsius }}°C
</span>
</template>
<script>
import { mapGetters, mapActions } from 'vuex'
export default {
props: ['celsius'],
name: 'temperature'
}
</script>
Instructions.vue
そして、ショートコードを使用してテキストを解析およびレンダリングする単純化されたコンポーネントを次に示します。
<template>
<div v-html="parseShortcodes(text)"></div>
</template>
<script>
import ShortcodeParser from 'meta-shortcodes'
import Temperature from 'Temperature.vue'
export default {
data: () => {
return {
text: 'Heat oven at [temp c=200]',
parser: ShortcodeParser()
}
},
components: [
Temperature
],
methods: {
parseShortcodes(text) {
return this.parser.parse(text)
}
},
created() {
this.parser.add('temp', function(options) {
return '<temperature :celsius="'+options.c+'"></temperature>'
})
}
}
</script>
解析は正常に機能し、置換がフロントエンドに出力されます。しかし、<temperature>
タグは文字どおりにレンダリングされ、Vue コンポーネントとしてではなく、ある程度予想されます。
オーブンを <temperature :celsius="200"></temperature> で加熱します
頭を包み込めないように見えるのは、Temperature
定義したコンポーネントに実際に変換するためにどのような手順を実行する必要があるかです。それは可能ですか?私が見逃しているこれを行うためのより正統な方法はありますか?
v-html
を使用してテキストをレンダリングすることには、セキュリティ上の懸念もあります。必ずしもこれが必要なわけではありませんがTemperature
、エスケープされた文字列からコンポーネントが表示されることを期待するのは、さらに無理があると思います。v-html
データベースに挿入する前にいつでもサニタイズできますが、可能であれば避けたいと思います。