Как заменить строку на компонент (vue)

У меня есть строки, содержащие ###, и я заменяю их значениями массива. Теперь я хочу использовать их с компонентом, я создал компонент, и он работает, но я не знаю, как использовать его в строках. Я не хочу оборачивать их вручную, потому что не знаю, какие будут струны, там может быть несколько ###. Если у него 2 ###, опции будут иметь 2 подмассива.

Как лучше это сделать?

Код: https://jsfiddle.net/tsobh4nu/

Vue.component('opt', {
  template: `<label>
                <span class = "bold" v-for = "(str,idx) in options">
                     {{str + " / "}}
                </span>
             </label>`,
  props:{options: Array}
})

new Vue({
  el: '#app',
  data: {
    str: "I have ### and you have a ###.",
      options: [
        ['AAA', 'BBB', 'CCC'],
        ['XXX', 'YYY', 'ZZZ']
      ]
  },
  computed:{
  	replacedStr(){
    	let newStr = this.str;
      this.options.forEach(option=>{
      	newStr = newStr.replace('###',this.concatenateOptions(option));
      })
      return newStr;
    }
  },
  methods: {
    concatenateOptions(strArr) {
      let separator = "";
      let strOptions = "";
      strArr.forEach(word => {
        strOptions += separator  + word;
        separator = " / ";
      });
      return strOptions;
    }
  }
})
.bold {
  font-weight: bold
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id = "app">
  <p>I want something like this, but using components: </p>
  {{replacedStr}}
  <br>
  <hr>
  My Components:<br>
  <opt :options = "options[0]"></opt>
  <br>
  <opt :options = "options[1]"></opt>
</div>

Большое спасибо.

### - это имя компонента? Если это так, вы можете использовать динамические компоненты.

ssc-hrep3 12.11.2018 08:05

нет, это то место, где я собираюсь заменить компонент. Я видел этот пример и думаю, что это другое. Они знают, куда поставить <component v-bind:is = "currentTabComponent"></component>. В моем случае не знаю, он более динамичный.

eag845 12.11.2018 14:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
2
13 246
2

Ответы 2

Это более общий характер, но я надеюсь, что это кому-то поможет. Добавьте в свой шаблон динамический компонент: <component v-bind:is = "processedHtml"></component>.

Затем добавьте вычисляемый метод:

computed: {
    processedHtml () {
        let html = this.html.replace('[Placeholder]', '<my-component></my-component>');
        return {
            template: '<div>' + html + '</div>'
        }
     }
}

Где <my-component> - это ваш пользовательский компонент, а this.html - это ваш HTML-контент, содержащий заполнитель [Placeholder].

Важно вернуть элемент с одним корневым узлом. Поэтому возврат упакован в <div>.

Прочтите более подробное руководство по этой проблеме здесь в моем блоге. Например, чтобы передать реквизиты в <my-component>

Мне не удалось использовать произвольный html в v-bind: is. В документации сказано, что вы можете использовать только имя компонента или объект опции компонентов. vuejs.org/v2/guide/components.html#Dynamic-Components Какую версию vue вы используете?

Conley Owens 22.08.2020 18:36

У меня была такая же проблема. У меня был элемент, который должен был отображать текущее количество элементов. Текущий счет пришел из магазина и постоянно менялся. Я использовал v-text. Я знаю, что это довольно специфическая ситуация, но, надеюсь, это поможет кому-то в будущем.

<P id = "results_count" v-text = "current_count"></P> 

а в части данных компонента у меня было свойство с именем current_count, которое обновлялось с помощью методов.

Другие вопросы по теме