Отображение неэкранированного HTML в Vue.js

191

Как я могу получить интерпретацию HTML внутри привязки усов? В настоящий момент break ( <br />) просто отображается / экранируется.

Небольшое приложение Vue:

var logapp = new Vue({
  el: '#logapp',
  data: {
    title: 'Logs',
    logs: [
      { status: true, type: 'Import', desc: 'Learn<br />JavaScript', date: '11.11.2015', id: 1  },
      { status: true, type: 'Import', desc: 'Learn<br />JavaScript', date: '11.11.2015', id: 1  }
    ]
  }
})

И вот шаблон:

<div id="logapp">    
    <table>
        <tbody>
            <tr v-repeat="logs">
                <td>{{fail}}</td>
                <td>{{type}}</td>
                <td>{{description}}</td>
                <td>{{stamp}}</td>
                <td>{{id}}</td>
            </tr>
        </tbody>
    </table>
</div>
Майк
источник
1
делать неэкранированный HTML для переноса строк - это излишне, просто хотел бы упомянуть об этом! это большой риск для безопасности
Райан Тейлор

Ответы:

203

Начиная с Vue2, тройные скобки устарели, вы должны использовать v-html.

<div v-html="task.html_content"> </div>

Из ссылки на документацию неясно, что именно мы должны разместить внутри v-html, ваши переменные входят внутрь v-html.

Также v-htmlработает только с <div>или <span>без <template>.

Если вы хотите увидеть это вживую в приложении, нажмите здесь .

thewhitetulip
источник
1
«но не с <template>» важная часть здесь, если вы пришли из Angular.js и ищете что-то вроде<ng-include>
domih
236

Вы можете использовать директиву v-html, чтобы показать это. как это:

<td v-html="desc"></td>
王 开朗
источник
3
Это на самом деле работает в vue2. Сначала один компилирует.
Yauheni Prakopchyk
1
у меня есть проблема с V-HTML, чтобы ограничить текст,? Можно ли ограничить текст в V-HTML? я пытался, это не удалось
Zum Dummi
86

Вы можете прочитать это здесь

Если вы используете

{{<br />}}

это сбежит. Если вы хотите сырой HTML, вы должны использовать

{{{<br />}}}

РЕДАКТИРОВАТЬ (5 февраля 2017 г.): Как указывает @hitautodestruct, в vue 2 вы должны использовать v-html вместо тройных фигурных скобок.

zeratulmdq
источник
1
Да, это даже в документах. Спасибо.
Майк
60
Обратите внимание, что в vue 2.0 тройные усы устарели, вместо этого следует использовать v-html .
hitautodestruct
5

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

Так что для вашего конкретного примера вам понадобится:

<div id="logapp">    
    <table>
        <tbody>
            <tr v-repeat="logs">
                <td v-html="fail"></td>
                <td v-html="type"></td>
                <td v-html="description"></td>
                <td v-html="stamp"></td>
                <td v-html="id"></td>
            </tr>
        </tbody>
    </table>
</div>

источник
4

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

<div v-html="html content data property"></div>
Shair Haider
источник