在 Vue 中强制刷新词缀

Posted

技术标签:

【中文标题】在 Vue 中强制刷新词缀【英文标题】:Force refresh of an affix in Vue 【发布时间】:2017-12-22 13:39:00 【问题描述】:

我在 Vue JS 页面中使用引导词缀。当我第一次导航到包含词缀的路线时(词缀的可见性通过v-if 控制),它与滚动完美配合。但是,当我从该路线离开然后再次返回时,词缀被破坏:它卡在页面顶部并且不滚动。

我在网上发现,如果我使用 jquery,我可以调用 $('#affix').affix('checkPosition') 来强制重新定位词缀(但我无法访问 jquery)。

我怀疑问题在于 Vue 在第一次加载时创建了词缀,然后缓存了相同的 DOM 对象以供以后使用。但是当它被重新插入到页面中时,bootstrap 不再意识到它并且粘贴行为中断了。

在这一点上,我想我有几个选择,其中任何一个都可以解决这个问题:

是否有一种从 Vue 组件中调用 Jquery 的智能方法?我没有在其他任何地方使用 Jquery,所以宁愿不使用。 有没有办法强制 Bootstrap 词缀刷新? 有没有办法强制 Vue 不缓存这个组件,每次加载都会创建一个新组件? 有没有更好的使用 Vue 创建词缀的方法?

谢谢!

这里是关注的 Vue 组件:

<template>
  <div id="funclist-affix" class="panel panel-default" data-spy="affix" data-offset-top="155">
    <div class="panel-body">
      <h4>Functions</h4>
      <div class="list-group function-list">
        <router-link v-for="(func,line) in functions" :key="line" :to="'#' + func.name" :class="['list-group-item', 'code', uncovered: func.uncovered]" :title="func.name"> func.name </router-link>
      </div>
    </div>
  </div>
</template>

<script>

export default 
  name: 'functionList',
  data () 
    return 

    
  ,
  props: ['functions']

</script>

<style>
a 
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;


#funclist-affix 
  max-height: calc(100% - 2 * 20px);
  overflow-y: auto;

</style>

【问题讨论】:

【参考方案1】:

你可以使用 jQuery。

<template>
  <!-- notice ref="myAffix" -->
  <div ref="myAffix" id="funclist-affix" class="panel panel-default" data-spy="affix" data-offset-top="155">
    <!-- content -->
  </div>
</template>

在你的组件脚本中:

<script>    
export default 
  name: 'functionList',
  data () 
    return 

    
  ,
  props: ['functions'],
  mounted() 
    this.$refs.myAffix.affix('checkPosition')
  

</script>

编辑:你也可以使用vue-strap,它有一个词缀组件。

https://github.com/yuche/vue-strap

【讨论】:

但是由于我在 Vue 中,我无法访问 Jquery。即$ 未定义。 如果您使用的是npm。然后使用npm i jquery --save 安装jquery,然后全局导入jquery。 window.$ = window.jQuery = require('jquery') 在创建 Vue 实例之前。 我不想加载 jQuery 只是为了运行一个函数。有没有办法让bootstrap做上面的事情?

以上是关于在 Vue 中强制刷新词缀的主要内容,如果未能解决你的问题,请参考以下文章

Vue组件强制刷新的解决方案

vue 强制刷新组件

Vue this.$forceUpdate() 强制刷新数据

vue 强制刷新子组件

如何在父组件中强制刷新子组件

vue 强制刷新组件