zoukankan      html  css  js  c++  java
  • Vue.js — 组件基础

    1.组件基础

    1.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>
    

    1.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>
    

    1.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传递数据的麻烦。

    1.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 模板时的注意事项

    参考:

  • 相关阅读:
    你知道这高效的12个Java精品库嘛?
    一篇文章带你吃透,Java界最神秘技术ClassLoader
    带你认真了解一下Java分布式系统的基本特性
    因为选定的用户拥有对象,所以无法除去该用户
    mysql自定义函数与过程中写法的注意事项
    使用nssm在windows服务器上部署nodejs
    shopnc 手机网站配置
    关于navicat远程连接mysql问题
    KindEditor 4.1.2版本,在上传图片的时候 设置为绝对路径
    微信分享图标制作
  • 原文地址:https://www.cnblogs.com/gzhjj/p/11769893.html
Copyright © 2011-2022 走看看