【问题标题】:Proper approach to showing subviews using Vue使用 Vue 显示子视图的正确方法
【发布时间】:2016-11-23 11:53:48
【问题描述】:

我是 Vue 的新手,并试图观察它的范例,我检查了页面,做了示例并与我非常方便的 Angular、MVC 等进行了比较。

我的场景如下。静态登陆 index.html 页面上有一个导航栏。在它下面,有一个为我的视图应用程序标记的 div,名为 #vapp。当用户点击不同的菜单时,我希望 div vapp 被重新填充:

  1. 特定视图的 HTML 代码,
  2. 将在表格和列表中使用的数据。

我的方法是更改​​ vapp.data 的值以对应视图中所需的值(使该字段成为我的视图模型)。但是,我有点卡在路由部分。我应该在点击事件中将 HTML 渲染为 Vue 吗?

也许我受到 Angular 的影响,但我自发地希望在单独的 HTML 文件中看到一个模板,该文件通过管道(推送、渲染——无论正确的命名是什么)进入我的 vapp em> div while 同时让它能够访问(最好绑定到)Vue 对象的 data 字段中提供的数据。

这是合适的方法吗?还是 Vue 背后的范式是为每个正在渲染的“页面”创建和维护一个新的 Vue 对象?

【问题讨论】:

标签: jquery html angularjs vue.js


【解决方案1】:

我从未使用过 Angular,但在 Vue 中,您可以使用 single file componentsvue-router 来实现 SPA。

方法是让一个页面为您的所有组件提供服务,并且每个组件本身可以由多个组件组成。所以首先你像这样设置一个路由器:

// import top level components
import Foo from './foo.js'
import Bar from './bar.js'

// Define routes, each route serves up a component
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

// Create a router
const router = new VueRouter({
  routes
})

// Mount it to your div
const app = new Vue({
  router
}).$mount('#app')

然后在您的HTML 中执行以下操作:

<div id="app">
  <!-- links you registered earlier -->
  <p>
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
   <!-- All content will be served up here -->
  <router-view></router-view>
</div>

现在,当点击这些链接时,vue 将提供 FooBar

至于提供数据,单个文件组件中的每个组件都是自包含的,因此您将与该组件相关的模板、样式和视图模型(数据)放在一个文件中:

<template>
  <div>
  {{message}}
  <my-component></my-component>
</div>

</template>

<script>
  // import components to be used in this component
  import myComponent from './myComponent'

  export default{
     // register imported components
     components: {
       myComponent
     },
     data(){
       return {
         message: 'Foo'
       }
     }
  }
</script>

这些需要用webpackbrowserify 之类的东西编译。

最终,当用户导航时,路由器会为您提供一堆自包含的组件,每个组件都包含它运行所需的所有组件。

【讨论】:

  • 组件中的导出和导入让我很困惑。在旧的 JavaScript 中如何解决它?导入是require(),对吧?并出口?
  • 是的,importrequireexport default 类似于 module.exports
  • 我无法让它工作(无论 import 还是 require())。您示例中的路由器配置在哪里?我的 index.js 中有它,但它不起作用(意外的令牌导入)。也许我应该把它放在别的地方?
  • 您是否安装了babel?如果您使用 ES2015 语法,则需要将其作为转换。您可能想查看vue-cli,它为最常见的Vue 设置提供了脚手架,因此您不必自己完成所有样板文件。
  • 我已经安装了 vue-cli 但我不确定是否正确使用它。也许我不明白脚手架是什么意思?将其安装并保存在配置 JSON 文件中就足够了吗?我没有得到的部分是我显然确实有 ES6 支持,因为我可以用那种语法做员工,我可以实例化 Vue。这是router that bugs me like I asked here。我想我已经接近了,但由于该地区的新手而错过了最后一部分(10 年以上的 C# 会对你这样做)。
【解决方案2】:

康拉德, 我认为您正在寻找 vue-router。 https://router.vuejs.org/en/

你有你的导航栏&lt;router-link&gt;s 然后一个&lt;router-view&gt; 将替换为routes 中配置的适当组件

您的vapp&lt;router-view&gt;

每个视图都是独立的 VUE 文件(组件)。

最好搭配 webpack-vue-template 来开发不仅仅是简单的组件。如果你想要路由等,你绝对应该使用 webpack 模板。 https://github.com/vuejs-templates/webpack

【讨论】:

  • 我一定会去看看的。在当前项目中,我们使用的是 MaterialCss 和 VueJs——我没有使用过这些。所以我尽量保持谦虚,不要建立一些会咬下一个人的东西。 +1
猜你喜欢
  • 1970-01-01
  • 2020-08-02
  • 2011-02-10
  • 2015-02-22
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多