Vue路由切换页面时如何加载Jqueryplugin/script?

How to load Jquery plugin/script when Vue router changes page?

我在这里四处寻找答案,none 已经提供的答案对我有用。

这是一个工作演示 codepen.io/figaro/pen/mBvWJa

我的项目很简单,一个用 Vue 处理页面路由的单页程序。我在每个不同的页面上都有一些基于 jQuery 的内容。当我第一次加载页面时,jQuery 插件显示正常。但是当我导航到其他页面时,jQuery 插件不会重新加载。自从挂钩以来,我已经尝试了所有我能想到的...mounted、beforeRouteEnter、beforeRouteLeave、updated 等,其中 none 有效。我试过使用 this.$nextTick(function () {} 但这也不起作用。

jQuery 插件是漂亮的轮播。是的,我知道有一个官方的 vue slick 包装器,但我没有使用 CLI ....我的项目只是通过 CDN 连接了 vue 和 vue 路由器,我不知道如何将它与我的项目一起使用已设置(他们的示例适用于单个文件组件)。我不在乎解决方案是否有问题或不是最佳实践,我只需要让 Vue 在每个页面上加载灵活的初始化脚本。我看到了制作指令或组件的示例,但它们对我来说没有意义,因为它们假设您使用的是单个文件组件,而我不是。有什么办法吗?

main.js 

  const NotFoundPage = {
  name: "NotFoundPage",
  template: "#404-template"
};

const routes = [
  { path: "/", component: Industry },
  { path: "/about", component: My Page },
  { path: "/contact", component: About},
  { path: "*", component: NotFoundPage }
];

const router = new VueRouter({
  routes
});

new Vue({
  router,
  template: "#root-template",
  mounted: function() {
    this.$nextTick(function () {
    })
  },
  beforeRouteUpdate ( to, from , next ) {
    this.$nextTick(function () {
    })
  },
  ready: function() {
    this.$nextTick(function () {
    })
  },
  updated () {
  }
}).$mount("#app");

html

<div id="app"></div>

 <template id="root-template">
 ...stuff

<view-router></view-router>

</template>

 <template id="industry"></template> etc

jquery 脚本

$('.gallery-responsive').slick({
  infinite: true,
  speed: 300,
  slidesToShow: 3,
  draggable: true,
  edgeFriction: 0.30,
  slidesToScroll: 1,
  responsive: [{
    breakpoint: 1100,
    settings: {
          slidesToShow: 2,
          slidesToScroll: 1
    }
}, {
    breakpoint: 900,
    settings: {
          slidesToShow: 2,
          slidesToScroll: 1
    }
}, {
    breakpoint: 800,
    settings: {
      slidesToShow: 1,
      slidesToScroll: 1,
      dots: false,
      arrows: false,
    }
}
]

});

这是一个工作演示 codepen.io/figaro/pen/mBvWJa

我尝试了您的演示并使用 next 修复了它 (check updated pen here)。

beforeRouteEnter(to, from, next) {
  next(vm => {
    $(".single-item").slick({
      dots: true
    });
  })
}

问题是您在 html 组件中的元素完全建立之前尝试使用 slick。相反,next 被调用 on the end of the navigation resolution flow

如果其他人来到这里是因为他们的 jQuery 代码只能在页面硬加载时与 Vue 一起工作(即当页面通过路由器重定向加载时不起作用),您可以移动你的 jQuery 代码到 mounted() 就可以了。

基本上,您需要等到页面准备就绪,然后才能 运行 jQuery 代码。

您可以通过将脚本中的 init 函数暴露给 window 对象来使其变得更好:

function slickInit() {
  $('.gallery-responsive').slick({});
}

window.slickInit = slickInit;

然后在你的 mounted() 钩子中你可以调用它:

window.slickInit()

或者在进入路由之前:

beforeRouteEnter(to, from, next) {
  next(() => {
    window.slickInit()
  })
}