Tôi có một hình thức trong một khu vực quản trị mà người dùng có thể nhập văn bản với shortcodes trong đó:động tiêm Vue 2 thành phần từ shortcode
lò nhiệt tại [tạm c = 200]
gì Tôi muốn là temp
mã ngắn để được phân tích cú pháp và chuyển thành thành phần Vue 2 khi được hiển thị trong giao diện người dùng.
Dưới đây là một đơn giản Temperature.vue
thành phần:
<template>
<span class="temperature">
{{ celsius }}°C
</span>
</template>
<script>
import { mapGetters, mapActions } from 'vuex'
export default {
props: ['celsius'],
name: 'temperature'
}
</script>
Và đây là một Instructions.vue
thành phần đơn giản mà sẽ phân tích và đưa ra các văn bản với shortcodes:
<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>
Các phân tích hoạt động tốt, và sự thay thế được in trong giao diện người dùng. Nhưng thẻ <temperature>
được hiển thị theo nghĩa đen chứ không phải là thành phần Vue, phần nào được mong đợi.
lò nhiệt ở nhiệt độ <: C = "200"> </nhiệt độ>
Những gì tôi dường như không thể quấn quanh đầu tôi là những gì bước tôi nên đưa cho nó để thực sự chuyển đổi vào thành phần Temperature
mà tôi đã xác định. Thậm chí có thể không? Có cách nào chính thống hơn để làm điều này mà tôi đang thiếu?
Ngoài ra còn có mối quan ngại về bảo mật khi sử dụng v-html
để hiển thị văn bản. Tôi không nhất thiết muốn điều này được ở đó, nhưng tôi đoán nó thậm chí còn xa vời hơn để mong đợi các thành phần Temperature
xuất hiện từ một chuỗi thoát. Tôi luôn có thể khử trùng trước khi chèn vào cơ sở dữ liệu, nhưng tôi vẫn muốn tránh v-html
nếu có thể.
Tuyệt, tôi thích cách tiếp cận này. Không xa những gì tôi có, thực sự ... Tôi sẽ kiểm tra nó càng sớm càng tốt và cho bạn biết! –