vue markdown loader解析md生成的组件,router view更新时怎么更改父组件的属性

用vue router注册路由时component是用vue markdown loader解析md文件生成的

router.component = r =>
          require.ensure([], () => r(require(`../docs/${router.name}.md`)));

页面结构如下:

<template>
      <router-view :class="$style.view"></router-view>
      <anchor-nav :anchos="textAnchors"></anchor-nav>
</template>

现在需要在router-view更新的时候,获取更新后router-view里面dom一些元素的id,用来做锚点导航,

document.querySelectorAll("h2")

要怎么做?
现在已经尝试的方法:
1.父组件mouted和update时都调用一次document.querySelectorAll("h2"),获取这个值时没问题,但是将这个值传给上面例子中anchor-nav时页面会卡死,不知道是什么原因;
2.利用vue router的导航守卫
但是根据官网完整的导航解析流程:

1导航被触发。
2在失活的组件里调用离开守卫。
3调用全局的 beforeEach 守卫。
4在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
5在路由配置里调用 beforeEnter。
6解析异步路由组件。
7在被激活的组件里调用 beforeRouteEnter。
8调用全局的 beforeResolve 守卫 (2.5+)。
9导航被确认。
10调用全局的 afterEach 钩子。
11触发 DOM 更新。
12用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

无法在dom更新后在获取到router view中dom的值。

请教各位大佬有没有比较好的方法。个人还想到一种方法是给解析生成的组件定义mouted,update这些方法,但是不知道该怎么做=_=....

阅读 3.5k
1 个回答

已解决。
参考Vuejs技术揭秘
vue中数据的变化到 DOM 的重新渲染是一个异步过程,发生在下一个 tick。
如果我们的某些方法去依赖了数据修改后的 DOM 变化,我们就必须在 nextTick 后执行。比如下面的伪代码:

getData(res).then(()=>{
  this.xxx = res.data
  this.$nextTick(() => {
    // 这里我们可以获取变化后的 DOM
  })
})

然后就可以在nextTick中获取到最新的dom进行操作了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题