【发布时间】:2018-04-05 08:47:05
【问题描述】:
我在 Vue.js 中有一个用于局部视图的简单组件 - question.blade.php:
{{--HTML code--}}
<my-component type='question'>
<div class="question">[Very long text content...]</div>
</my-component>
{{--more HTML code--}}
组件背后的想法是围绕问题内容创建“显示更多 - 显示更少”逻辑。
组件已编译并在页面加载时呈现良好。但是,在某些情况下,我需要通过 Ajax 动态加载问题。为此,我进行了一个简单的 jQuery Ajax 调用,检索 question.blade.php 的 HTML 并将其附加到 DOM 中。问题是,组件未编译。
如何确保在渲染局部视图时始终编译组件,而不管它是在页面加载时发生还是通过 Ajax 调用发生?
完整的组件代码:
{% verbatim %}
<template>
<div>
<div v-bind:class="cssClasses" v-html="content"></div>
<div v-if="activateShowMore && !isShown" class="sml-button closed" v-on:click="toggleButton()">
<span class="sml-ellipsis">...</span><span class="sml-label">{{$t('show_more')}}</span>
</div>
<div v-if="activateShowMore && isShown" class="sml-button open" v-on:click="toggleButton()">
<span class="sml-label">{{$t('show_less')}}</span>
</div>
</div>
</template>
<style lang="sass" scoped>
/*styles*/
</style>
<script type="text/babel">
export default {
props: ['content', 'type'],
data() {
return {
activateShowMore: false,
isShown: false,
cssClasses: this.getCssClasses()
}
},
locales: {
en: {
'show_more': 'show more',
'show_less': 'show less'
},
de: {
'show_more': 'mehr anzeigen',
'show_less': 'weniger anzeigen'
}
},
mounted() {
this.checkShowMore();
},
watch: {
isShown: function(shouldBeShown) {
this.cssClasses = this.getCssClasses(shouldBeShown);
}
},
methods: {
checkShowMore: function() {
let $element = $(this.$el);
let visibleHeight = $element.outerHeight();
let realHeight = $element.find('.text-area-read').first().outerHeight();
let maxHeight = this.getMaxHeight();
this.activateShowMore = (visibleHeight === maxHeight) && (visibleHeight < realHeight);
},
getMaxHeight: function() {
switch (this.type) {
case 'question':
return 105;
case 'answer':
return 64;
}
},
toggleButton: function() {
this.isShown = !this.isShown;
},
getCssClasses: function(shouldBeShown) {
if (undefined === shouldBeShown || !shouldBeShown) {
return 'sml-container' + ' sml-' + this.type + ' sml-max-height';
}
return 'sml-container' + ' sml-' + this.type;
}
}
}
</script>
【问题讨论】:
-
php 用于服务器,尝试使用 html
-
vue 组件是否依赖于 ajax 调用的结果?如是!那你怎么把这些数据发送到 vue 呢。
-
@zeidanbm 该组件背后的想法是围绕问题文本创建“显示更多 - 显示更少”逻辑。因此,每次我调用 Ajax 来检索问题时,我都需要“显示更多”组件来处理其文本内容。
-
您几乎需要在 DOM 中通知您的组件更新。我宁愿把所有的逻辑都拉到 vue 里面,然后在里面做 http 请求。但是您也许可以在此处使用事件。能否请您发布您的 vue 组件代码?
-
@zeidanbm 更新了帖子。问题是,我正在处理一个遗留代码库,而用于检索问题的 Ajax 调用是通过另一个脚本中的 jQuery 完成的。 “显示更多” Vue.js 组件是新的。
标签: javascript ajax laravel vue.js