Voici mon approche :
Vue.component('my-component', {
props: ['word'],
template: '<span class="my-component">{{word}}</span>'
})
new Vue({
el: '#app',
data() {
return {
text: 'Foo is the new Bar.',
filters: new Set(['Foo', 'Bar'])
}
},
computed: {
tokens() {
return this.text.match(/(?:\b|^).+?(?:\b|$)/g)
}
}
})
.my-component {
color: #0095ff;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<template v-for="token in tokens">
<my-component v-if="filters.has(token)" :word="token"></my-component>
<template v-else>{{ token }}</template>
</template>
</div>
L'idée est assez simple :
- diviser la chaîne désirée en jetons
- pour chaque token, vérifier s'il est dans la liste des mots :
- si oui, rendez-le avec votre composant
- sinon, rendez-le par défaut
Cela fera littéralement ce que vous voulez :)
REMARQUE : l'utilisation de template
permet d'avoir une sortie HTML propre, sans inutiles div
o span
éléments.