Nano Hash - криптовалюты, майнинг, программирование

VueJs: слот для компонента как свойство

Я прочитал документацию и не уверен, что то, чего я пытаюсь достичь, действительно выполнимо. То, что мне нужно, - это свойство компонента, которое содержит теги html, которые, очевидно, создают недопустимый html - поэтому мне было интересно, есть ли способ передать html в компонент и отправить его дальше с испускаемым событием. Наиболее подходящим способом было бы иметь named slot, но я не думаю, что могу связать содержимое именованного слота с внутренним свойством.

Компонент, над которым я работаю, - это простой диалог подтверждения. Компонент триггера будет заключать в оболочку два слота - один для метки, а другой для сообщения, которое я хотел бы отправить вместе с событием в компонент диалога.

Мой компонент триггера на данный момент выглядит так:

<template>
    <a :class="cssClass" @click="clicked()">
        <slot></slot>
    </a>
</template>
<script>
    export default {
        props: {
            id: {
                type: String,
                required: true
            },
            route: {
                type: String,
                required: true
            },
            message: {
                type: String,
                required: true
            },
            cssClass: {
                type: String,
                required: false
            }
        },
        mounted() {
            window.EventHandler.listen('confirm-dialog-' + this.id + '-called', () => {
                window.location.reload(true);
            });
        },
        methods: {
            clicked() {
                window.EventHandler.fire('top-confirm', {
                    id: 'confirm-dialog-' + this.id,
                    message: this.message,
                    url: this.route
                });
            }
        }
    };
</script>

и при добавлении в html:

<call-dialog
    route="{{ route('subscriber.destroy', $subscriber->id) }}"
    css-class="alert"
    id="{{ $subscriber->id }}"
    message="Are you sure you wish to remove '{{ $subscriber->email }}'?<br />There is no undo!"
>
   <i class="fa fa-trash"></i> Remove
</call-dialog>

Как видите, в настоящий момент я передаю сообщение, используя message prop, но этот конкретный содержит тег <br />, который создает недопустимый html.

Есть идеи, как с этим справиться?

ПРИМЕЧАНИЕ

Думаю, я нашел способ сделать это с именованными слотами:

<template>
    <a :class="cssClass" @click.prevent="clicked()">
        <slot name="label"></slot>
    </a>
</template>
<script>
    export default {
        props: {
            id: {
                type: String,
                required: true
            },
            route: {
                type: String,
                required: true
            },
            cssClass: {
                type: String,
                required: false
            }
        },
        mounted() {
            window.EventHandler.listen('confirm-dialog-' + this.id + '-called', () => {
                window.location.reload(true);
            });
        },
        methods: {
            message() {
                 return this.$slots.message[0].context.message;
            },
            clicked() {
                window.EventHandler.fire('top-confirm', {
                    id: 'confirm-dialog-' + this.id,
                    message: this.message(),
                    url: this.route
                });
            }
        }
    };
</script>

А теперь просто переходящий и дополнительный именованный слот slot="message"

<call-dialog
    route="{{ route('subscriber.destroy', $subscriber->id) }}"
    css-class="alert"
    id="{{ $subscriber->id }}"
>
    <span slot="label"><i class="fa fa-trash"></i></span>
    <span slot="message">Are you sure you wish to remove '{{ $subscriber->email }}'?<br />There is no undo!</span>
</call-dialog>

  • Вы можете сохранить его в vuex и отправить ключ как свойство. Вам нужен ключ, чтобы найти ценность в магазине 17.05.2017

Ответы:


1

Вы должны использовать v-html внутри компонента call-dialog, чтобы вставить необработанный HTML из опоры сообщения в элемент.

<div v-html="message"></div>

https://vuejs.org/v2/api/#v-html

17.05.2017
  • Спасибо, но я не об этом прошу - я не использую его - я передаю его другому компоненту. Вопрос в том, как передать его как свойство, не являясь на самом деле атрибутом тега компонента. 17.05.2017
  • @SebastianSulinski создает вычисляемое свойство, которое возвращает нужную вам строку. Затем передайте это вычисленное свойство как ваше message значение следующим образом: :message="myCreatedString" 17.05.2017
  • Извините - я, должно быть, не объяснил это хорошо - я знаю, как связывать свойства и т. Д. Его значение не будет привязано к какому-либо элементу - оно будет отправлено диспетчером событий - мне нужно передать его в компонент без использования атрибуты - возможно, именованные слоты, но тогда как я могу получить содержимое слота и связать его с локальной переменной, например, из компонента. 17.05.2017

  • 2

    Мне пришлось сделать что-то подобное для пользовательского компонента кнопки.

    Vue.prototype.$getSlotText = function( name = 'default' ) {
        const htmlElements = this.$slots[name];
        if(!htmlElements || !htmlElements.length) return '';
    
        return htmlElements.reduce((fullText, {tag, text}) => {
            return fullText + (tag === 'br' ? '\n' : text || '');
        }, '');
    }
    

    По сути, это будет иметь доступ к HTML-элементам в слоте по умолчанию (по умолчанию).

    • Если ничего не найдено, возвращает '' пустую строку.
    • Если они найдены, выполняется итерация по каждому элементу, объединяет его text свойство, если оно найдено, или \n, если это тег <br/>.

    Примечание. Метод .reduce(...) используется для итерации / конкатенации. В качестве альтернативы вызов .map(...) с аналогичной стрелочной функцией, за которым следует .join(''), вероятно, приведет к тому же результату.

    14.10.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..