ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
https://jsrun.pro/CLfKp/edit ### 基本示例 组件是可复用的Vue实例, 所以与new Vue接收相同的选项, 例如: data、computed、watch、methods。 ### 组件的复用 组件可以任意次的复用 #### data 必须是一个函数 **一个组件的`data`选项必须是一个函数**,因此每个实例可以维护一份被返回对象的独立的拷贝: ``` data: function () { return { count: 0 } } ``` ### 组件的组织 通常一个应用会一一颗组件树的形式来组织。 例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。 * 全局注册 * 局部注册 ### 通过Prop向子组件传递数据 props 选项包含该组件可接受的prop列表。 ``` Vue.component('blog-post', { props: ['title'], template: '<h3>{{ title }}</h3>' }) ``` 一个组件默认可以拥有任意数量的 prop,任何值都可以传递给任何 prop。在上述模板中,你会发现我们能够在组件实例中访问这个值,就像访问`data`中的值一样。 一个 prop 被注册之后,你就可以像这样把数据作为一个自定义 attribute 传递进来 ``` <blog-post title="My journey with Vue"></blog-post> <blog-post title="Blogging with Vue"></blog-post> <blog-post title="Why Vue is so fun"></blog-post> ``` 以上也可以通过data 里的数组实现。 ``` new Vue({ el: '#blog-post-demo', data: { posts: [ { id: 1, title: 'My journey with Vue' }, { id: 2, title: 'Blogging with Vue' }, { id: 3, title: 'Why Vue is so fun' } ] } }) <blog-post v-for="post in posts" v-bind:key="post.id" v-bind:title="post.title" ></blog-post> ``` ### 单个根元素 ``` <h3>{{ title }}</h3> <div v-html="content"></div> ``` 然而如果你在模板中尝试这样写,Vue 会显示一个错误,并解释道**every component must have a single root element (每个组件必须只有一个根元素)**。你可以将模板的内容包裹在一个父元素内,来修复这个问题,例如: ``` <div class="blog-post"> <h3>{{ title }}</h3> <div v-html="content"></div> </div> ``` 看起来当组件变得越来越复杂的时候,我们的博文不只需要标题和内容,还需要发布日期、评论等等。为每个相关的信息定义一个 prop 会变得很麻烦: ``` <blog-post v-for="post in posts" v-bind:key="post.id" v-bind:title="post.title" v-bind:content="post.content" v-bind:publishedAt="post.publishedAt" v-bind:comments="post.comments" ></blog-post> ``` 所以是时候重构一下这个`<blog-post>`组件了,让它变成接受一个单独的`post`prop: ``` <blog-post v-for="post in posts" v-bind:key="post.id" v-bind:post="post" ></blog-post> ``` ``` Vue.component('blog-post', { props: ['post'], template: ` <div class="blog-post"> <h3>{{ post.title }}</h3> <div v-html="post.content"></div> </div> ` }) ``` 上述的这个和一些接下来的示例使用了 JavaScript 的模板字符串来让多行的模板更易读。它们在 IE 下并没有被支持,所以如果你需要在不 (经过 Babel 或 TypeScript 之类的工具) 编译的情况下支持 IE,请使用折行转义字符取而代之 ### 监听子组件事件 #### 使用事件抛出一个值