如何在没有 App.vue 的情况下进行组件渲染

Posted

技术标签:

【中文标题】如何在没有 App.vue 的情况下进行组件渲染【英文标题】:How can i have component render without App.vue 【发布时间】:2021-10-28 14:18:47 【问题描述】:

我正在尝试将 vue-cli 用于应用程序,但我想知道我可以在不使用 App.vue 的情况下使用组件吗? 这里的组件显示在 html 中,但是当我单击按钮时,组件中的 testFunction 没有被调用,但是在 html 中显示了“单击此处”按钮

index.html

<!DOCTYPE html>

<html lang="">

  <head>

    <meta charset="utf-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width,initial-scale=1.0">

    

  </head>

  <body>

   <h1>hi</h1>

    <div id="app">

      <MyComponent @my-event="testFunction"></MyComponent>

    

    </div>

    <!-- built files will be auto injected -->

    

  </body>

  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11" defer></script>

  <script  src="main.js" defer></script>

</html>

MyComponent.vue

    <div class="child" @click="$emit('my-event')">

click here

     </div>

 </template>

 

 <script>

export default 

  name: 'MyComponent',

  props: 

  



</script>

main.js

import Vue from 'vue/dist/vue.js'

import MyComponent from './components/MyComponent'

Vue.config.productionTip = false

Vue.component('MyComponent',MyComponent);

new Vue(

  el: '#app',

  beforeCreate() 

    console.log('Vue instance beforeCreate!');

  ,

  created() 

      console.log('Vue instance created!');

  ,

  

  mounted() 

    fetch('https://jsonplaceholder.typicode.com/todos')

    .then(response => response.json())

    .then(json => this.todos=json);

  ,

  

  components: 

   MyComponent

  ,

    

  data: 

      todos:null,

      data:null

  ,

  

   methods: 

       testFunction:function()

         console.log("clicked");

       

    ,

  

  render:h => h(MyComponent),

).$mount('#app')

我的问题:

    此处未调用 MyComponent 中的 testFunction。但我看到 MyComponent 是 $emit 我不使用 App.vue 有没有办法注册组件,无需渲染:h => h(myComponent)?并且没有 $mount("#app")? 3.出现【Vue warn】:Cannot find element: #app error in console

【问题讨论】:

有没有办法注册组件,没有 - 你希望它如何被使用?这听起来像 XY 问题。如果您有具体的问题需要解决,请描述它。 【参考方案1】:

不,这在 vue-cli 的默认配置下是不可能的。如果您想将组件全局导入或仅导入特定模块,那么这是完全可能的,但您所要求的是不可能的。如果您想了解更多关于本地和全局导入的信息,请阅读here。

虽然有一个潜在的解决方法。您可以创建第二个 div 以将应用程序挂载到其中,然后使用MyComponent 组件作为该挂载div 的基础组件。但是,您将无法在两个 Vue 应用程序之间直接共享数据,并且这种行为是为 Modal 插入保留的;然而,现在正确的方法是通过传送元素。您可以阅读有关传送元素的更多信息here

// main.js
import  createApp  from 'vue';

import App from './App.vue';
import MyComponent from './components/MyComponent.vue';


createApp(App).mount('#app');
createApp(MyComponent).mount('#app2');
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without javascript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <div id="app2"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

【讨论】:

以上是关于如何在没有 App.vue 的情况下进行组件渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有控制器余烬的情况下重新渲染另一个组件内的子组件

vue-antd-admin框架(二) 布局与页面渲染

React 组件有时会在状态不变的情况下渲染两次

在非常相似的组件的情况下,进行条件渲染的最佳方法是啥?

在没有宿主元素容器的情况下渲染嵌套组件 - 将 SVG 部分分成不同的组件

为什么不存在vue组件渲染?