在 vue3 中导入外部组件和松散的反应性

Posted

技术标签:

【中文标题】在 vue3 中导入外部组件和松散的反应性【英文标题】:Import external component and loose reactivity in vue3 【发布时间】:2021-05-03 13:06:13 【问题描述】:

我有 2 个项目/文件夹(根目录上有 Lerna)。

第一个是带有一些组件的 uicomponents,第二个是测试一个使用 uicomponents 中的一些组件的简单应用程序。

我创建了一个简单的计数器组件(Counter.vue):

<template>
  <div>
    <h3>Total clicks:  count </h3>
    <div class="button-container">
      <button class="inc" @click.prevent="increment">Add</button>
      <button class="dec" @click.prevent="decrement">Subtract</button>
    </div>
  </div>
</template>

<script>
import  defineComponent, ref  from 'vue';

export default defineComponent(
  name: 'Counter',
  props: 
    startingNumber: 
      type: Number,
      required: false,
      default: 0,
    ,
  ,
  setup(props) 
    const count = ref(props.startingNumber);
    const increment = () => 
      count.value += 1;
      alert(count.value);
    ;
    const decrement = () => 
      count.value -= 1;
    ;
    return 
      count,
      increment,
      decrement,
    ;
  ,
);
</script>

然后我将它导入我的应用程序中的一个简单页面:

<template>
  <div class="hello">
    <h1> msg </h1>
    <counter :starting-number="5"></counter>
  </div>
</template>

<script lang="ts">
import  defineComponent  from 'vue';
import Counter from '@uicomponents/counter';

export default defineComponent(
  name: 'HelloWorld',
  components: 
    Counter,
  ,
  props: 
    msg: 
      type: String,
      required: false,
      default: 'Me',
    ,
  ,
);
</script>

Lerna 正确替换了我所有的组件路径,并且我在我的页面中使用所有 html 检索了我的组件计数器。按钮效果很好,我的警报显示为正确的值但我的 html 没有刷新。

此文本&lt;h3&gt;Total clicks: count &lt;/h3&gt; 保持“总点击次数:0”。我的“计数”参考更新得很好,因为警报显示它正确但不是在 html 中。

【问题讨论】:

【参考方案1】:

我也有类似的反应性丧失问题。我的设置有点不同,但最终结果是一样的。

我正在尝试构建一个加载外部组件的小型插件系统 我大致尝试这样做

// pluginSystem.js is accessible through window.myps
// ...
init(app) 
    vueApp = app;
,
// ...
loadPlugin(data) 
    vueApp.component(data.component.name, data.component);

我的外部组件看起来像这样

// main.js
import Counter from './components/Counter.vue';

window.myps.loadPlugin(
    component: Counter,
);

计数器中的按钮单击等工作,控制台日志记录也很好,但组件数据没有更新。 我也尝试过defineComponent和defineAsyncComponent,但是像你一样我没有运气......

【讨论】:

我可以将我的问题追溯到合成 api。 Usimg import reactive from 'vue' 在插件中生成一个单独的 vue 副本。有几种解决方案,例如 package.json 中的“将 vue 添加为 dev/peerDependencies”,或者在 webpack 配置中将 vue 定义为外部。但不幸的是,这两种解决方案都不适合我......【参考方案2】:

试试看


    import  defineAsyncComponent, defineComponent  from "vue"
    

components:          
      Counter:defineAsyncComponent(() => import("@uicomponents/counter"))
    

【讨论】:

感谢您的帮助。我已经尝试过了,但它不起作用。我试图将我的 COunter.vue 组件放在我的应用程序及其作品的同一个文件夹中......这很奇怪......也许是 Lerna 的问题?

以上是关于在 vue3 中导入外部组件和松散的反应性的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在下一个 js 中从节点模块外部的文件夹中导入模块

为啥在组件中导入 VS 硬编码时,对象数组的行为会有所不同?

在 vue 3 中导入组件

在反应组件中导入分割的css文件

在 s-s-r 上的反应组件中导入 scss