好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

vue 组件基础知识总结

组件 基础

1 组件的复用

组件是可复用的Vue实例。

?

<!DOCTYPE html>

< html >

  < head >

   < meta charset = "utf-8" > 

   < style >

   

   </ style >

   < script src = "https://cdn.staticfile.org/ vue /2.4.2/vue.min.js" ></ script >

  </ 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属性必须是一个函数,每个实例维护一份被返回对象的独立的拷贝。

?

<!DOCTYPE html>

< html >

  < head >

   < meta charset = "utf-8" > 

   < style >

   

   </ style >

   < script src = "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></ script >

  </ 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 向子组件传递数据

?

<!DOCTYPE html>

< html >

  < head >

   < meta charset = "utf-8" > 

   < style >

   

   </ style >

   < script src = "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></ script >

  </ 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。

?

<!DOCTYPE html>

< html >

  < head >

   < meta charset = "utf-8" > 

   < style >

   

   </ style >

   < script src = "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></ script >

  </ 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 单个根元素

每个组件必须只有一个根元素。

?

<!DOCTYPE html>

< html >

  < head >

   < meta charset = "utf-8" > 

   < style >

   

   </ style >

   < script src = "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></ script >

  </ 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 监听子组件事件

?

<!DOCTYPE html>

< html >

  < head >

   < meta charset = "utf-8" > 

   < style >

   

   </ style >

   < script src = "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></ script >

  </ 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 方法并传入事件名称来触发一个事件。父组件可以接收该事件。

我们可以使用事件抛出一个值。

?

<!DOCTYPE html>

< html >

  < head >

   < meta charset = "utf-8" > 

   < style >

   

   </ style >

   < script src = "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></ script >

  </ 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。

?

<!DOCTYPE html>

<html>

  <head>

   <meta charset= "utf-8" > 

   <style>

   

   </style>

   <script src= "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></script>

  </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>

   <script src= "https://cdn.staticfile.org/vue/2.4.2/vue.min.js" ></script>

  </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 组件基础知识总结的详细内容,更多关于vue 组件的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/gzhjj/p/11769893.html

查看更多关于vue 组件基础知识总结的详细内容...

  阅读:48次