vue 组件基础知识总结
这篇文章主要介绍了vue 组件基础知识的相关资料,帮助大家更好的理解和使用vue的组件,感兴趣的朋友可以了解下
组件基础
1 组件的复用
组件是可复用的Vue实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <!DOCTYPE html> < html > < head > < meta charset = "utf-8" > < style > </ style > </ head > < body > < div id = "app" > < button-counter ></ button-counter > < button-counter ></ button-counter > < button-counter ></ button-counter > </ div > < script > // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '< button v-on:click = "count++" >点击了 {{ count }} 次.</ button >' }); new Vue({ el: '#app' }); </ script > </ body > </ html > |
注意当点击按钮时,每个组件都会各自独立维护它的count。这里自定义组件的data属性必须是一个函数,每个实例维护一份被返回对象的独立的拷贝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <!DOCTYPE html> < html > < head > < meta charset = "utf-8" > < style > </ style > </ head > < body > < div id = "app" > < button-counter ></ button-counter > < button-counter ></ button-counter > < button-counter ></ button-counter > </ div > < script > var buttonCounterData = { count: 0 } // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return buttonCounterData }, template: '< button v-on:click = "count++" >点击了 {{ count }} 次.</ button >' }); new Vue({ el: '#app' }); </ script > </ body > </ html > |
2 通过 Prop 向子组件传递数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <!DOCTYPE html> < html > < head > < meta charset = "utf-8" > < style > </ style > </ head > < body > < div id = "app" > < 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 > </ div > < script > Vue.component('blog-post', { props: ['title'], template: '< h3 >{{ title }}</ h3 >' }) new Vue({ el: '#app' }); </ script > </ body > </ html > |
这里<blog-post>
组件就是通过自定义属性title
来传递数据。
我们可以使用v-bind
来动态传递prop。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <!DOCTYPE html> < html > < head > < meta charset = "utf-8" > < style > </ style > </ head > < body > < div id = "app" > < blog-post v-for = "post in posts" v-bind:key = "post.id" v-bind:title = "post.title" ></ blog-post > </ div > < script > Vue.component('blog-post', { props: ['title'], template: '< h3 >{{ title }}</ h3 >' }) new Vue({ el: '#app', data: { posts: [ { id: 1, title: 'My journey with Vue' }, { id: 2, title: 'Blogging with Vue' }, { id: 3, title: 'Why Vue is so fun' } ] } }); </ script > </ body > </ html > |
3 单个根元素
每个组件必须只有一个根元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <!DOCTYPE html> < html > < head > < meta charset = "utf-8" > < style > </ style > </ head > < body > < div id = "app" > < blog-post v-for = "post in posts" v-bind:key = "post.id" v-bind:post = "post" ></ blog-post > </ div > < script > Vue.component('blog-post', { props: ['post'], template: ` < div class = "blog-post" > < h3 >{{ post.title }}</ h3 > < div v-html = "post.content" ></ div > </ div > ` }) new Vue({ el: '#app', data: { posts: [ { id: 1, title: 'My journey with Vue', content: 'my journey...' }, { id: 2, title: 'Blogging with Vue', content: 'my blog...' }, { id: 3, title: 'Why Vue is so fun', content: 'Vue is so fun...' } ] } }); </ script > </ body > </ html > |
注意到v-bind:post="post"绑定的post是一个对象,这样可以避免了需要通过很多prop传递数据的麻烦。
4 监听子组件事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <!DOCTYPE html> < html > < head > < meta charset = "utf-8" > < style > </ style > </ head > < body > < div id = "app" > < div :style = "{fontSize: postFontSize + 'em'}" > < blog-post v-for = "post in posts" v-bind:key = "post.id" v-bind:post = "post" v-on:enlarge-text = "postFontSize += 0.1" /> </ div > </ div > < script > Vue.component('blog-post', { props: ['post'], template: ` < div class = "blog-post" > < h3 >{{ post.title }}</ h3 > < button v-on:click = "$emit('enlarge-text')" >放大字体</ button > < div v-html = "post.content" ></ div > </ div > ` }) new Vue({ el: '#app', data: { postFontSize: 1, posts: [ { id: 1, title: 'My journey with Vue', content: 'my journey...' }, { id: 2, title: 'Blogging with Vue', content: 'my blog...' }, { id: 3, title: 'Why Vue is so fun', content: 'Vue is so fun...' } ] } }); </ script > </ body > </ html > |
子组件通过$emit
方法并传入事件名称来触发一个事件。父组件可以接收该事件。
我们可以使用事件抛出一个值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <!DOCTYPE html> < html > < head > < meta charset = "utf-8" > < style > </ style > </ head > < body > < div id = "app" > < div :style = "{fontSize: postFontSize + 'em'}" > < blog-post v-for = "post in posts" v-bind:key = "post.id" v-bind:post = "post" v-on:enlarge-text = "postFontSize += $event" /> </ div > </ div > < script > Vue.component('blog-post', { props: ['post'], template: ` < div class = "blog-post" > < h3 >{{ post.title }}</ h3 > < button v-on:click = "$emit('enlarge-text', 0.2)" >放大字体</ button > < div v-html = "post.content" ></ div > </ div > ` }) new Vue({ el: '#app', data: { postFontSize: 1, posts: [ { id: 1, title: 'My journey with Vue', content: 'my journey...' }, { id: 2, title: 'Blogging with Vue', content: 'my blog...' }, { id: 3, title: 'Why Vue is so fun', content: 'Vue is so fun...' } ] } }); </ script > </ body > </ html > |
在父组件中,我们可以通过$event访问到被抛出的这个值。
我们可以在组件上使用v-model。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <style> </style> </head> <body> <div id= "app" > <!-- <input v-model= "searchText" > --> <input v-bind:value= "searchText" v-on:input= "searchText = $event.target.value" > <p>{{ searchText }}</p> </div> <script> new Vue({ el: '#app' , data: { searchText: '' } }); </script> </body> </html> <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <style> </style> </head> <body> <div id= "app" > <custom-input v-model= "searchText" ></custom-input> <custom-input v-bind:value= "searchText" v-on:input= "searchText = $event" ></custom-input> <p>{{ searchText }}</p> </div> <script> Vue.component( 'custom-input' , { props: [ 'value' ], template: `<input v-bind:value= "value" v-on:input= "$emit('input', $event.target.value)" >` }) new Vue({ el: '#app' , data: { searchText: '' } }); </script> </body> </html> |
最后,注意解析 DOM 模板时的注意事项。
以上就是vue 组件基础知识总结的详细内容