2016-01-28 3 views
3

Есть ли способ применить фильтр к содержимому слота в компоненте Vue?Компоненты vue.js: как обрезать текст в элементе слота в компоненте?

Чтобы уточнить, я хотел бы обрезать текст, включенный вручную в HTML. Например, я хотел бы преобразовать это:

<!-- In the view --> 
<my-component> 
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Cumque, 
laboriosam quasi rerum obcaecati dignissimos autem laudantium error 
quas voluptatibus debitis? 
</my-component> 

в это:

<!-- Generated component --> 
<div> 
Lorem ipsum dolor sit amet, consectetur adipisicing ... 
</div 

Я не могу найти эту информацию в документации.

спасибо.

ответ

3

Вы можете использовать фильтр, чтобы обрезать его.

//credit to @Bill Criswell for this filter 
Vue.filter('truncate', function (text, stop, clamp) { 
    return text.slice(0, stop) + (stop < text.length ? clamp || '...' : '') 
}) 

Затем дайте фильтр длину вы хотите струна быть

<my-component> 
    {{'Lorem ipsum dolor sit amet, consectetur adipisicing' | truncate 50 }} 
</my-component> 

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

+0

Очень похоже на ответ, который я собирался предлагать. Есть ли причина, почему вы обертываете ее в div? Был ли этот быстрый тестовый пример, и он работает хорошо: https://jsfiddle.net/crswll/q3L78cst/ –

+0

Нет причин вообще, я схватил фильтр из быстрого Google. Понял, что кто-то уже проделал работу над фильтром усечения. Обновлен ответ с гораздо более простой версией. – Jeff

+1

{{данные | усекать (50)}} –

3

То же самое по аналогичным образом может быть:

в файле main.js:

var filter = function(text, length, clamp){ 
    clamp = clamp || '...'; 
    var node = document.createElement('div'); 
    node.innerHTML = text; 
    var content = node.textContent; 
    return content.length > length ? content.slice(0, length) + clamp : content; 
}; 

Vue.filter('truncate', filter); 

в шаблоне:

{{data.content | truncate(300, '...')}} 
Смежные вопросы