【问题标题】:Prevent mounting component if element with id doesn't exist如果具有 id 的元素不存在,则阻止安装组件
【发布时间】:2018-07-15 13:33:50
【问题描述】:

我正在开发一个使用表单构建器 (Symfony) 生成表单的项目。在某些情况下,下面的内部 Vue 组件会根据作为 prop 传入的输入 id,将标准 TextArea 输入替换为更灵活的基于 html 的文本编辑器。

问题是,在某些情况下,id 为 image_id 的元素不会出现在页面上,因此会产生大量 javascript 错误(因为页面是使用模板呈现的)。

如果页面上有一个 id 为 #image_id 的元素,是否可以安装 image-uploader 组件,否则完全阻止组件的安装?

组件片段

mounted() {
            let DOMInput = document.getElementById(this.inputId);
             //component does stuff if not null
            //need to prevent the mounting of this component altogether if it is null

模板

<image-uploader input-id="image_id"></image-uploader>

【问题讨论】:

    标签: javascript vue.js ecmascript-6 vuejs2


    【解决方案1】:

    您可以简单地在组件上添加一个v-if 指令并仅在找到image_id 时才呈现它:

    <image-uploader input-id="image_id" v-if="condition to check whether image-id exists"></image-uploader>
    

    new Vue({
      el: "#app",
      data: {
        idExist: null
      },
      mounted () {
        this.idExist = document.getElementById('test')
      }
    })
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
    
    <div id="app">
      <div id="test">test</div>
      <div v-if="idExist">render if test is here</div>
    </div>

    【讨论】:

    • 感谢您的回复。是的,我熟悉 v-if 指令。这效果不好,因为我每次想实例化组件时都需要添加类似'v-if="document.getElementById('image_id') !== null" 的东西,我希望将该逻辑封装到组件中。
    • 此外,在 v-if 条件中不允许引用 document
    • 可以在mounted生命周期中计算条件,更新数据属性,然后将数据属性放入v-if作为条件。
    • 我相信你可以在子组件和父组件中都有条件,但是你必须决定是否在父组件中渲染组件,所以我可能只是在父组件中进行。
    • 是的,我也得出了相同的结论,我将把它留在父级中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2011-01-23
    • 2016-04-16
    • 2015-03-04
    • 2019-02-24
    相关资源
    最近更新 更多