代码之家  ›  专栏  ›  技术社区  ›  Serge

为什么Vue的v-if不能及时呈现块?

  •  0
  • Serge  · 技术社区  · 6 年前

    小型测试组件:

    <template>
      <div 
        id="report-chart"
        v-if="report"
      ></div>
      <div v-else>
        Loading...
      </div>
    </template>
    
    <script>
      import ReportChart from '@/components/report-chart'
      export default {
        data () {
          return {
            report: null
          }
        },
        watch: {
          report (value) {
            if (value) this.showReport()
          }
        },
        methods = {
          showReport () {
            // I expect the 'report-chart' elem exists but Im wrong.
            console.log(document.getElementById('report-chart')) // -> null
          },
          loadReport () {
            // returns Promise
          }
        },
        mounted () {
          this.loadReport().then(data => (this.report = data))
        }
      }
    </script>
    

    当我调用console.log()时,我希望呈现elem“report chart”,但没有错。为什么?所有需要的触发器都已打开,并且DIV必须在文档中。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Serge    6 年前

    Vue需要时间来呈现元素 v-if 条件实现后。所以我只需要等待和修改观察者:

    watch: {
      report (value) {
        if (value) {
          this.$nextTick().then(() => this.showReport())
        }
      }
    }
    

    和平!

        2
  •  -1
  •   Murwa    6 年前

    要使其正常工作,请在所需元素上删除if。

    <template>
        <div id="report-chart"></div>
        <div v-if="!report">
            Loading...
        </div>
    </template>
    

    移除手表,并将渲染函数移动到mounted方法。

    mounted () {
      this.loadReport().then(data => {this.report = data; this.showReport();})
    }