Vue - 组件重新渲染的两种方式

Vue - 组件重新渲染的两种方式

一. 组件上进行 key 值更改

最简单,推荐使用

  • Vue是通过diffing算法比较虚拟DOM和真实DOM,来判断新旧 DOM 的变化。key是虚拟DOM对象的标识,在更新显示时key表示着DOM的唯一性。
  • DOM是否变化的核心是通过判断新旧DOM的key值是否变化,如果key发生改变,则重新渲染该DOM,如果key没变,则不会重新DOM。

如果想让组件重新渲染,只需要给组件加上key属性,然后在需要重新渲染的时候,将组件绑定的key值更改就可以。

父组件:

<template>
  <div class="home">
    <h2>父组件</h2>
    <button @click="rerender">改变组件绑定的key值,重新渲染组件</button>
    <div class="item" v-for="(item, index) of 3" :key="index">
      <child :id="item" :key="key"></child>
    </div>
  </div>
</template>

<script>
import Child from "./child.vue";
export default {
  components: {
    Child
  },
  data() {
    return {
      key: Date.now()
    };
  },
  methods: {
    rerender() {
      this.key = Date.now();
    }
  }
};
</script>

<style scoped>
.home {
  padding: 20px;
  box-sizing: border-box;
}
.item {
  background: #e2e2e2;
  padding: 10px;
  margin: 10px 0;
  box-sizing: border-box;
}
</style>

子组件:

<template>
  <div>子组件</div>
</template>

<script>
export default {
  props: ["id"],
  data() {
    return {};
  },
  mounted() {
    this.getDataById();
  },
  methods: {
    getDataById() {
      console.log("子组件方法执行了,获取父组件的id:" + this.id);
    }
  }
};
</script>

二. v-if 指令

  • 当DOM设置为false的时候,当前条件块中的DOM会被销毁。如果条件块包含的是组件,则组件对应的生命周期函数(beforeDestroydestroyed等)会执行。
  • 当DOM设置为true的时候,当前条件块中的DOM会被重建。如果条件块包含的是组件,则组件对应的生命周期函数(createdmounted等),计算属性,watch等都会执行,相当于重新渲染。

父组件:

<template>
  <div class="home">
    <h2>父组件</h2>
    <button @click="rerender">改变组件v-if的值,重新渲染组件</button>
    <div class="item" v-for="(item, index) of 3" :key="index">
      <child :id="item" v-if="isShow"></child>
    </div>
  </div>
</template>

<script>
import Child from "./child.vue";
export default {
  components: {
    Child
  },
  data() {
    return {
      isShow: true
    };
  },
  methods: {
    rerender() {
      // 从 DOM 中删除 child 组件
      this.isShow = false;
      this.$nextTick(() => {
        // 在 DOM 中添加 child 组件
        this.isShow = true;
      });
    }
  }
};
</script>

<style scoped>
.home {
  padding: 20px;
  box-sizing: border-box;
}
.item {
  background: #e2e2e2;
  padding: 10px;
  margin: 10px 0;
  box-sizing: border-box;
}
</style>

子组件:

<template>
  <div>子组件</div>
</template>

<script>
export default {
  props: ["id"],
  data() {
    return {};
  },
  mounted() {
    this.getDataById();
  },
  methods: {
    getDataById() {
      console.log("子组件方法执行了,获取父组件的id:" + this.id);
    }
  },
};
</script>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue-Router 是 Vue.js 的官方路由管理器,用于实现单页应用(SPA)的页面跳转和组件切换。如果 Vue-Router 不渲染,可能存在以下几种原因: 1. 路由配置错误:首先需要检查路由的配置是否正确。确保在创建 Vue 实例时,已经将 Vue-Router 注册为插件,并在路由配置中正确定义了路由表和相关的组件。 2. 路由链接错误:如果路由不渲染,可能是因为路由链接设置不正确。检查在模板或代码中生成的路由链接,确保它们与路由表中定义的路径匹配。 3. 路由视图未正确渲染Vue-Router 会将指定路径的组件渲染到 <router-view> 标签中。如果路由组件没有正确渲染,可以检查路由视图的位置是否正确,并确保路由组件已经正确注册并被导入。 4. 路由模式设置错误:Vue-Router 支持两种路由模式,hash 模式和 history 模式。如果路由不渲染,可能是因为设置的路由模式有问题。可以检查路由模式的设置,确保使用的是支持的模式,并检查是否正确配置了服务器来处理 history 模式。 5. 路由钩子函数问题:路由钩子函数可以在路由切换前后执行一些操作,例如登录验证等。如果路由不渲染,可能是因为路由钩子函数中的逻辑有问题。可以检查路由钩子函数的实现,确保逻辑正确,并尝试去除或简化钩子函数来确定问题所在。 总之,调试 Vue-Router 不渲染的问题需要仔细检查路由的配置、链接、视图位置,以及路由模式和钩子函数等方面的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值