在 VueJS 组件中导入使用 getElementById 的模块

Posted

技术标签:

【中文标题】在 VueJS 组件中导入使用 getElementById 的模块【英文标题】:Importing module that uses getElementById in VueJS component 【发布时间】:2017-07-03 09:10:52 【问题描述】:

我正在尝试将 Blockly(通过 npm 的 node-blockly)导入 VueJS 组件,但 Blockly 的 javascript 部分包含 getElementById() 调用,这会导致错误为 document.getElementById() 在 VueJS 中不可用。

知道如何解决这个问题吗?

(编辑)代码示例:

<template> 
 <div class="hello"> 
   <div id="blocklyDiv" style="height: 480px; width: 600px;">
   </div> 
    <xml id="toolbox" ref=toolbox style="display: none"> 
     <block type="controls_if"></block> 
     <block type="text"></block> <block type="text_print"></block> 
    </xml> 
   </div> 
</template> 
<script> 
 import Blockly from "node-blockly" 
 export default  name: 'hello'  
 var workspace = Blockly.inject('blocklyDiv', toolbox: document.getElementById('toolbox')); 
</script>

【问题讨论】:

我不确定我是否理解。 document.getElementById 适用于 vue.js。你能提供一个不起作用的代码示例吗? 我认为您使用的是具有 eslint 的 webpack 版本?如果是,那么您需要在 eslintrc 中允许浏览器。如果这是您的情况,那么我将发布答案。 我在创建 webpack 项目(使用 vue cli)时选择不使用 eslint。 【参考方案1】:

这对我有用

<script>
export default 
    mounted() 
        console.log('blockly');
           var workspace = Blockly.inject('blocklyDiv', 
             toolbox: document.getElementById('toolbox')
           );

           var blocklyArea = document.getElementById('blocklyArea');
           var blocklyDiv = document.getElementById('blocklyDiv');

           var workspace = Blockly.inject(blocklyDiv, 
              toolbox: document.getElementById('toolbox')
           );

  ....
,

【讨论】:

更新 - 这种方法不允许 Blockly.JavaScript.workspaceToCode(workspace);正在调查。【参考方案2】:

假设您使用的是 VueJS 版本 2,您可以在模板中标记您的元素后使用 this.$refs.myElement 访问对元素的引用。

例子:

<div ref="blocklyDiv" style="height: 480px; width: 600px;">

mounted () 
  this.workspace = Blockly.inject(this.$refs.blocklyDiv);

然后,对你的工具箱做同样的事情。

【讨论】:

【参考方案3】:

我想是 v2。

试试mounted event

<template> 
 <div class="hello"> 
   <div id="blocklyDiv" style="height: 480px; width: 600px;">
   </div> 
    <xml id="toolbox" ref=toolbox style="display: none"> 
     <block type="controls_if"></block> 
     <block type="text"></block> <block type="text_print"></block> 
    </xml> 
   </div> 
</template> 
<script> 
 import Blockly from "node-blockly" 
 export default  
   name: 'hello',
   data()
     return 
       workspace: null
     
   ,
   mounted()
     this.workspace = Blockly.inject('blocklyDiv', toolbox: document.getElementById('toolbox'));
   
  
</script>

【讨论】:

恐怕这并没有什么不同。调用注入时的 getElementById() 函数实际上不是问题。它是 Blockly JS 中的 getElementById()。我猜需要将其他元素(xml、工具箱等)正确注册为子组件。我会试试这个并在这里发布结果....

以上是关于在 VueJS 组件中导入使用 getElementById 的模块的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs 在另一个组件中导入组件

如何在 laravel 5.3 + VueJs Routes 中导入外部组件

VueJS 和 SASS - 在脚本中导入和使用 SASS 变量

在 vuejs 2 组件中导入 css/js 文件的问题

在 VueJS 中导入带有字体的 CSS 文件

使用 vuejs 时,没有在 html 文件中导入 firebase 脚本标签