Как поместить код Vue в тег <code> в vue

Я впервые делаю пакет npm, делаю демо-версию пакета и хочу привести пример использования компонента.

когда я помещаю использование компонента внутри тега pre и code, как это

показывает эту ошибку

Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side-effects in your templates, such as <style>, as they will not be parsed.

это мой код (App.vue):

<template>
<pre>
    <code>
        <template>
            <vlider
            :id = "'first'"
            :vlider-data = "slider"
            :theme = "'theme-dark'"
            v-model = "inputRange"
            @click = "vliderClick()"
            >
                <template> slot = "bullet" slot-scope = "bullet"
                    <label>{{ bullet.data.label }}</label>
                    <i
                    class = "em"
                    :class = "[`em-${bullet.data.extras.icon}`]"
                    ></i> 
                    <a target = "_blank" :href = "bullet.data.extras.learnMore">Learn more ?</a>
                </template>
            </vlider>
        </template>
        <script>
            import Vlider from "vlider";

            export default {
                name: "app",
                components: {
                    Vlider
                },
                data() {
                    return {
                        inputRange: null,
                        slider: [
                            {label: "Angry", color: "#ffc300", extras: { icon: 'angry', learnMore: 'http://localhost/'}},
                            {label: "Expressionless", color: "#ffb0fe", extras: { icon: 'expressionless', learnMore: 'http://localhost/'}},
                            {label: "Astonished", color: "#ff6bd6", extras: { icon: 'astonished', learnMore: 'http://localhost/'}},
                            {label: "Confounded", color: "#ff9d76", extras: { icon: 'confounded', learnMore: 'http://localhost/'}},
                            {label: "Okay?", color: "#51eaea", extras: { icon: 'face_with_raised_eyebrow', learnMore: 'http://localhost/'}},
                            {label: "Blush", color: "#fb3569", extras: { icon: 'blush', learnMore: 'http://localhost/'}}
                        ]
                    };
                },
                watch: {
                    inputRange() {
                        console.info(this.inputRange)
                    }
                },
                methods: {
                    vliderClick() {
                        console.info(`clicked`)
                    }
                }
            };
        </script>
        <style>
            import "vlider/src/sass/vlider.scss"
        </style>
    </code>
</pre>
</template>

<script>
import Vlider from "vlider";
...
</script>

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

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
9 321
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

пользователь v-htmlдокументы и не забывайте использовать \ после каждого разрыва строки, чтобы продолжить строку и игнорировать '' как текстовый контекст с помощью \'

так и будет:

    <div v-html = "example">
     <pre>
      ...
     </pre>    
    </div>

или

<div>
  {{example}}
</div>

и example вы определяете его внутри data()

это не работает, это дает мне еще одну ошибку, потому что, по-видимому, v-html отображает html внутри него, что вызовет еще одну ошибку

KawishBit 18.02.2019 17:58

попробуйте использовать стиль мустажа {{}}

mooga 18.02.2019 18:49

я попробовал стиль mustage, он говорит, что не распознает метод импорта, что означает, что он по какой-то причине отображает тег <style>, я действительно запутался в том, как обрабатывать этот фрагмент кода как строку

KawishBit 19.02.2019 04:05

я попробовал еще раз, используя v-html, на этот раз я использую объекты html, и все работает гладко, спасибо за вашу помощь

KawishBit 19.02.2019 04:37

Предполагается, что директива v-пре говорит Vue не компилировать эту часть шаблона, но Vue, похоже, по-прежнему выдает те же предупреждения, если его содержимое включает (например) тег <script>. В любом случае он не показывает свое содержимое как необработанный HTML. Вы захотите вытащить это в переменную данных, а нет использовать здесь v-html (что делает противоположное тому, что вы хотите):

new Vue({
  el: '#app',
  data() {
    return {
      codeSample: `
<template>
    <vlider
    :id = "'first'"
    :vlider-data = "slider"
    :theme = "'theme-dark'"
    v-model = "inputRange"
    @click = "vliderClick()"
    >
        <template> slot = "bullet" slot-scope = "bullet"
            <label>{{ bullet.data.label }}</label>
            <i
            class = "em"
            :class = "['em-\${bullet.data.extras.icon}']"
            ></i> 
            <a target = "_blank" :href = "bullet.data.extras.learnMore">Learn more ?</a>
        </template>
    </vlider>
</template>
<script>
    import Vlider from "vlider";
    export default {
        name: "app",
        components: {
            Vlider
        },
        data() {
            return {
                inputRange: null,
                slider: [
                    {label: "Angry", color: "#ffc300", extras: { icon: 'angry', learnMore: 'http://localhost/'}},
                    {label: "Expressionless", color: "#ffb0fe", extras: { icon: 'expressionless', learnMore: 'http://localhost/'}},
                    {label: "Astonished", color: "#ff6bd6", extras: { icon: 'astonished', learnMore: 'http://localhost/'}},
                    {label: "Confounded", color: "#ff9d76", extras: { icon: 'confounded', learnMore: 'http://localhost/'}},
                    {label: "Okay?", color: "#51eaea", extras: { icon: 'face_with_raised_eyebrow', learnMore: 'http://localhost/'}},
                    {label: "Blush", color: "#fb3569", extras: { icon: 'blush', learnMore: 'http://localhost/'}}
                ]
            };
        },
        watch: {
            inputRange() {
                console.info(this.inputRange)
            }
        },
        methods: {
            vliderClick() {
                console.info('clicked')
            }
        }
    };
</\script>
<style>
    import "vlider/src/sass/vlider.scss"
</style>
        `
    }
  }
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id = "app">
  <pre><code>{{codeSample}}</code></pre>
</div>

Встраивание больших фрагментов HTML в переменную данных, конечно, немного неуклюже и требует некоторого экранирования различных фрагментов (например, включенного тега ${...} и </script> в вашем примере). Это может быть проще в обслуживании, если вы импортируете эту строку HTML через ajax или как импорт веб-пакета, а не напрямую встраиваете ее внутрь data(), как я сделал здесь.

(Вы также можете взглянуть на vue-highlightjs, если хотите раскрасить синтаксис ваших примеров кода; это также зависит от наличия исходного кода в переменной данных компонента, а не встроенного в шаблон.)

Или легкий способ

Если вы хотите избежать HTML-кода раньше времени, вы можете вставить его прямо в шаблон и использовать v-pre, чтобы указать Vue игнорировать любые символы усов во встроенном HTML-коде:

new Vue({
  el: '#app'
});
<script src = "https://unpkg.com/vue@latest/dist/vue.js"></script>
<div id = "app">

  <pre><code v-pre>&lt;script&gt;... {{foo}} &lt;/script&gt;</code></pre>

</div>

я попробовал стиль mustage, он говорит, что не распознает метод импорта, что означает, что он по какой-то причине отображает тег <style>, я действительно запутался в том, как обрабатывать этот фрагмент кода как строку

KawishBit 19.02.2019 04:05

импорт html в виде строки может потребовать некоторой возни с webpack; см. stackoverflow.com/questions/37818401/…

Daniel Beck 19.02.2019 05:18

Поэтому я исправляю это, используя этот веб-сайт для кодирования моего кода https://mothereff.in/html-entities.

а затем я использую закодированную версию, помещаю ее в переменную и передаю в v-html, а vue обрабатывает ее как строку и отображает как строку

<pre>
  <code v-html = "yourCodeVariable">
  </code>
</pre>
...
<script>
...
data() {
  return {
     yourCodeVariable: `your encoded html code here`
  }
}
...

Это долгий путь вокруг. Если вы хотите кодировать html, вам ничего из этого не нужно, вы можете просто поместить закодированную версию прямо в шаблон. Если вы вытащите его в переменную данных, вам не придется его кодировать; просто вставьте его без v-html (что означает, что vue закодирует его для вас!)

Daniel Beck 19.02.2019 13:36

@DanielBeck, я только что попробовал, и это выдает мне ошибку для 2-го блока кода, потому что в нем есть некоторые символы мустажа, и vue воспринимает его как обычный символ мустажа, я думаю, что лучше сделать это с помощью v-html и переменные, чтобы избежать ошибок

KawishBit 19.02.2019 16:36

Ах, хороший момент, но вы можете использовать v-pre, чтобы исправить это (я обновил свой ответ, чтобы показать пример). Я действительно не знаю, почему вы хотите использовать здесь v-html; если вы уже приложили усилия для извлечения строки HTML в переменную данных, вы можете позволить Vue выполнить работу по ее кодированию вместо того, чтобы делать это вручную.

Daniel Beck 19.02.2019 17:16

@DanielBeck о да, ты прав, спасибо за твое предложение

KawishBit 20.02.2019 07:47

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