如何将Vue的主应用程序渲染到body元素?

Jam*_*wis 4 html javascript css vue.js

我正在使用名为"pages"的付费主题的项目中构建管理页面.

问题是,在这些主题,<nav>并且<header>必须是直接的儿童<body>.

当我使用Vue的自举程序,我就渲染一个<div>具有id设置为界面root.然后,这巢<nav><header>此容器内(即下<div id="root">).

我一直在寻找如何让Vue组件成为身体的直接孩子.

这该怎么做?


我得到了什么:

<body>
    <div>
        <nav></nav>
        <header></header>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

主题需要什么:

<body>
    <nav></nav>
    <header></header>
</body>
Run Code Online (Sandbox Code Playgroud)

Jęd*_*bek 12

使用Vue 2.0,您无法将根实例挂载到body或html元素.您将收到[Vue warn]: Do not mount Vue to <html> or <body> - mount to normal elements instead.错误消息.

所提供的元件仅用作安装点.与Vue 1.x不同,在所有情况下,已安装的元素将替换为Vue生成的DOM.因此,不建议将根实例安装到<html><body>.

https://vuejs.org/v2/api/#el

解决方法是在组件mount()事件上手动移动元素.

<div id="app">
  <navbar :msg="msg"></navbar>

  Lorem ipsum dolor sit amet, consectetur adipisicing elit.

  <button @click="msg = 'tested'">Test 2-way binding</button>
</div>
Run Code Online (Sandbox Code Playgroud)

示例工作流程

new Vue({
    el: '#app',
  data: {
    msg: 'message'
  },
  components: {
    'navbar': {
      template: `<navbar>{{ msg }}</navbar>`,
      props: ['msg'],
      mounted() {
        document.body.insertBefore(this.$el, document.body.firstChild)
      }
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/jedrzejchalubek/m9dnsjjr/2/


小智 5

使用 Vue 3,您可以

let YourApp = {
  data() {
    return {
      message: 'Hello World!'
    }
  },
  template: `
      <nav>Nav</nav>
      <header>Header</header>
      <span> inspect to see </span>
  `
}

// Browser Version - vue.global.js
Vue.createApp(YourApp).mount('body')
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/npm/vue@3.0.2/dist/vue.global.min.js"></script>
Run Code Online (Sandbox Code Playgroud)