最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

vue组件中watch props根据v-if动态判断并挂载DOM的问题

来源:懂视网 责编:小采 时间:2020-11-27 21:57:11
文档

vue组件中watch props根据v-if动态判断并挂载DOM的问题

vue组件中watch props根据v-if动态判断并挂载DOM的问题:问题复现:父组件中通过名为 source 的 prop 向子组件 Chart 传入数据 <Chart :source=chartData></Chart> import Chart from '../components/Chart' export default { name: 'Home', com
推荐度:
导读vue组件中watch props根据v-if动态判断并挂载DOM的问题:问题复现:父组件中通过名为 source 的 prop 向子组件 Chart 传入数据 <Chart :source=chartData></Chart> import Chart from '../components/Chart' export default { name: 'Home', com

在代码中增加一行代码:

watch: {
 source (newVal, oldVal) {
 console.log(newVal, this.$refs.main) // [Array ...] undefined
 this.setOpts()
 }
 },

启示 source 数据虽然有了,但 div 还并未挂载,因此 echarts 无法完成初始化

那么想当然的我们就会去在 mounted 生命周期函数中调用 setOpts 方法:

mounted () {
 console.log(this.source, this.$refs.main) // [] undefined
 this.setOpts()
 },

这样也是错的,因为模板语法中使用了 v-if,那么当 source 并未满足条件的时候,div 当然也不会挂载。因此 div 仍然无法访问到。

Error in mounted hook: "TypeError: Cannot read property 'getAttribute' of undefined"

解决办法是要么去掉 v-if 要么换另一种写法

有时我们需要在没有数据的情况下增加一个占位标签用来展示一些额外的提醒信息,如“暂未获取到数据”等。那么去掉 v-if 肯定不行。

既然如此我们保留 v-if 但写法有所改变:

修改 Chart 组件:

<template>
 <div>
 <div id="main" ref="main" style="width: 600px;height: 400px;"></div>
 </div>
</template>

我们只需要一个 source 数据源,当 mounted 的时候调用 setOpts 方法,当 watch 数据变化的时候再次调用以更新数据

export default {
 name: 'Chart',
 props: ['source'],
 mounted () {
 this.setOpts()
 },
 watch: {
 source () {
 this.setOpts()
 }
 },
 methods: {
 setOpts () {
 let myChart = this.$echarts.init(this.$refs.main)
 myChart.setOption({
 dataset: {
 dimensions: ['score', 'amount', 'product'],
 source: this.source
 },
 xAxis: { type: 'category' },
 yAxis: {},
 series: [
 {
 type: 'bar',
 encode: {
 x: 'product',
 y: 'amount'
 }
 }
 ]
 })
 }
 }
}

v-if 的判断我们把他移出去了我们判断 chartData 是否获取到,一旦获取到数据,马上加载 Chart 组件,这样就可以避开在组件内部调用 v-if 带来的问题:

<template>
 <div>
 <Chart :source="chartData" v-if="flag"></Chart>
 <div v-else>none</div>
 </div>
</template>
import Chart from '../components/Chart'

export default {
 name: 'Home',
 components: { Chart },
 data () {
 return {
 chartData: [],
 flag: false
 }
 },
 methods: {
 getData () {
 setTimeout(() => {
 this.chartData = [
 [89.3, 58212, 'Matcha Latte'],
 [57.1, 78254, 'Milk Tea'],
 [74.4, 41032, 'Cheese Cocoa'],
 [50.1, 12755, 'Cheese Brownie'],
 [89.7, 20145, 'Matcha Cocoa'],
 [68.1, 79146, 'Tea'],
 [19.6, 91852, 'Orange Juice'],
 [10.6, 101852, 'Lemon Juice'],
 [32.7, 20112, 'Walnut Brownie']
 ]
 this.flag = true
 }, 2000)
 }
 },
 mounted () {
 this.getData()
 }
}

另外还可将 Chart 组件和站位标签一同封装成一个 ChartWrapper。

这样就不会因在组件内部调用 watch 监听 props 的变化动态 v-if 判断并挂载数据到 DOM 上出现的这种问题了。

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

vue组件中watch props根据v-if动态判断并挂载DOM的问题

vue组件中watch props根据v-if动态判断并挂载DOM的问题:问题复现:父组件中通过名为 source 的 prop 向子组件 Chart 传入数据 <Chart :source=chartData></Chart> import Chart from '../components/Chart' export default { name: 'Home', com
推荐度:
标签: 动态 动态的 watch
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top