前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(15)打鸡儿教你Vue.js

(15)打鸡儿教你Vue.js

作者头像
达达前端
发布2019-07-03 11:09:19
8810
发布2019-07-03 11:09:19
举报
文章被收录于专栏:达达前端

组件化vue.js

Component Tree

组件单向绑定 组件双向绑定 组件单次绑定

创建组件构造器 注册组件 使用组件

Vue.extend()

Vue.component()

使用组件

代码语言:javascript
复制
<div id="app">
<my-component></my-component>
</div>
<script src="js/vue.js"></script>

// 创建一个组件构造器
var myComponent = Vue.extend({
 template: '<div>my</div>'
})

// 注册组件
Vue.component('my-component', myComponent)

new Vue({
el: '#app'
});

image.png

全局注册和局部注册 局部注册的方式:

代码语言:javascript
复制
new Vue({
el: '#app',
components: {
 'my-component' : myComponent
}
});

image.png

代码语言:javascript
复制
|  | <!DOCTYPE html> |
|  | <html> |
|  | 
 |
|  | <head> |
|  | <meta charset="UTF-8"> |
|  | <title></title> |
|  | <link rel="stylesheet" href="[styles/demo.css](https://keepfool.github.io/vue-tutorials/02.Components/Part-1/styles/demo.css)" /> |
|  | </head> |
|  | 
 |
|  | <body> |
|  | 
 |
|  | <div id="app"> |
|  | 
 |
|  | <table> |
|  | <tr> |
|  | <th colspan="3">父组件数据</td> |
|  | </tr> |
|  | <tr> |
|  | <td>name</td> |
|  | <td>{{ name }}</td> |
|  | <td><input type="text" v-model="name" /></td> |
|  | </tr> |
|  | <tr> |
|  | <td>age</td> |
|  | <td>{{ age }}</td> |
|  | <td><input type="text" v-model="age" /></td> |
|  | </tr> |
|  | </table> |
|  | <my-component v-bind:my-name="name" v-bind:my-age="age"></my-component> |
|  | </div> |
|  | 
 |
|  | <template id="myComponent"> |
|  | <table> |
|  | <tr> |
|  | <th colspan="3">子组件数据</td> |
|  | </tr> |
|  | <tr> |
|  | <td>my name</td> |
|  | <td>{{ myName }}</td> |
|  | <td><input type="text" v-model="myName" /></td> |
|  | </tr> |
|  | <tr> |
|  | <td>my age</td> |
|  | <td>{{ myAge }}</td> |
|  | <td><input type="text" v-model="myAge" /></td> |
|  | </tr> |
|  | </table> |
|  | </template> |
|  | </body> |
|  | <script src="[js/vue.js](https://keepfool.github.io/vue-tutorials/02.Components/Part-1/js/vue.js)"></script> |
|  | <script> |
|  | var vm = new Vue({ |
|  | el: '#app', |
|  | data: { |
|  | name: 'keepfool', |
|  | age: 28 |
|  | }, |
|  | components: { |
|  | 'my-component': { |
|  | template: '#myComponent', |
|  | props: ['myName', 'myAge'] |
|  | } |
|  | } |
|  | }) |
|  | </script> |
|  | 
 |
|  | </html> |

image.png

组件注册语法糖

代码语言:javascript
复制
Vue.component()
// 全局注册:
Vue.component('my-component', {
 template: '<div>this is the first component!</div>'
})
var vm1=new Vue({
el: '#app'
})

局部注册:

代码语言:javascript
复制
var vm = new Vue({
el: '#app',
components: {
// 局部注册
'my-component': {
template: '<div></div>'
},
}
})
代码语言:javascript
复制
| <!DOCTYPE html> |
|  | <html> |
|  | <head> |
|  | <meta charset="UTF-8"> |
|  | <title></title> |
|  | </head> |
|  | <body> |
|  | <div id="app1"> |
|  | <my-component1></my-component1> |
|  | </div> |
|  | ---------------app1和ap2的分割线--------------- |
|  | <div id="app2"> |
|  | <my-component1></my-component1> |
|  | <my-component2></my-component2> |
|  | <my-component3></my-component3> |
|  | </div> |
|  | </body> |
|  | <script src="[js/vue.js](https://keepfool.github.io/vue-tutorials/02.Components/Part-1/js/vue.js)"></script> |
|  | <script> |
|  |  |
|  | // 全局注册,my-component1是标签名称 |
|  | Vue.component('my-component1',{ |
|  | template: '<div>This is the first component!</div>' |
|  | }) |
|  |  |
|  | var vm1 = new Vue({ |
|  | el: '#app1' |
|  | }) |
|  |  |
|  | var vm2 = new Vue({ |
|  | el: '#app2', |
|  | components: { |
|  | // 局部注册,my-component2是标签名称 |
|  | 'my-component2': { |
|  | template: '<div>This is the second component!</div>' |
|  | }, |
|  | // 局部注册,my-component3是标签名称 |
|  | 'my-component3': { |
|  | template: '<div>This is the third component!</div>' |
|  | } |
|  | } |
|  | }) |
|  |  |
|  | </script> |
|  | </html> |
|  |

image.png

代码语言:javascript
复制
<!DOCTYPE html>
<html>

<body>

<div id="app">
<my-component></my-component>
</div>

<script type="text/x-template" id="myComponent">
<div>this is a component</div>
</script>

</body>

<script src="js/vue.js"></script>

<script>
Vue.component('my-component',{
template: '#myComponent'
})
new Vue({
el: '#app'
})
</script>

</html>

使用<template>标签

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>

<body>
<div id="app">
 <my-component></my-component>
</div>

<template id="myComponent">
<div>this is a component</div>
</template>

</body>

<script src="js/vue.js"></script>
<script>
Vue.component('my-component',{
template: '#myComponent'
})

new Vue({
el: '#app'
})
</script>
</html>

image.png

image.png

使用props

代码语言:javascript
复制
var vm = new Vue({
el: '#app',
data: {
 name: 'jeskson',
 age: 0
},
components: {
 'my-component': {
  template: '#myComponent',
  props: ['myName', 'myAge']
 }
}
})

如果我们想使父组件的数据,则必须先在子组件中定义props属性 定义子组件的html模板:

代码语言:javascript
复制
<template id="myComponent">
<table>
<tr>
<th colspan="2">
子组件数据
</th>
</tr>
<tr>
<td>my name</td>
<td>{{ myName }}</td>
</tr>
<tr>
 <td>my age</td>
<td>{{ myAge }}</td>
</tr>
</table>
</template>

image.png

将父组件数据通过已定义好的props属性传递给子组件:

代码语言:javascript
复制
<div id="app">
<my-component v-bind:my-name="name" v-bind:my-age="age"></my-component>
</div>

在prop中定义的myName,在用作特性时需要转换为my-name

prop的绑定类型 单向绑定-修改了子组件的数据,没有影响父组件的数据

代码语言:javascript
复制
<my-component v-bind:my-name="name" v-bind:my-age="age"></my-component">


<template id="myComponent">
 <table>
 <tr>
 <ht colspan="3">子组件数据</td>
 </tr>
 <tr>
 <td>my name</td>
 <td>{{ myName}}</td>
 <td><input type="text" v-model="myName"/></td>
  
 <tr>
 <td>my age</td>
 <td>{{myAge}}</td>
 <td><input type="text" v-model="myAge"/></td>
 </tr>
 
 </table>
</template>

image.png

代码语言:javascript
复制
<!DOCTYPE html> 
 <html> 
 
  <head> 
 <meta charset="UTF-8"> 
 <title></title> 
 <link rel="stylesheet" href="styles/demo.css" /> 
 </head> 
 
  <body> 
 
  <div id="app"> 
 
  <table> 
 <tr> 
 <th colspan="3">父组件数据</td> 
 </tr> 
 <tr> 
 <td>name</td> 
 <td>{{ name }}</td> 
 <td><input type="text" v-model="name" /></td> 
 </tr> 
 <tr> 
 <td>age</td> 
 <td>{{ age }}</td> 
 <td><input type="text" v-model="age" /></td> 
 </tr> 
 </table> 
 <my-component v-bind:my-name="name" v-bind:my-age="age"></my-component> 
 </div> 
 
  <template id="myComponent"> 
 <table> 
 <tr> 
 <th colspan="3">子组件数据</td> 
 </tr> 
 <tr> 
 <td>my name</td> 
 <td>{{ myName }}</td> 
 <td><input type="text" v-model="myName" /></td> 
 </tr> 
 <tr> 
 <td>my age</td> 
 <td>{{ myAge }}</td> 
 <td><input type="text" v-model="myAge" /></td> 
 </tr> 
 </table> 
 </template> 
 </body> 
 <script src="js/vue.js"></script> 
 <script> 
 var vm = new Vue({ 
 el: '#app', 
 data: { 
 name: 'keepfool', 
 age: 28 
 }, 
 components: { 
 'my-component': { 
 template: '#myComponent', 
 props: ['myName', 'myAge'] 
 } 
 } 
 }) 
 </script> 
 
  </html> 

双向绑定 使用.sync

代码语言:javascript
复制
<my-component v-bind:my-name.sync="name" v-bind:my-age.sync="age"></my-component>

image.png

代码语言:javascript
复制
 <!DOCTYPE html> 
 <html> 
 
  <head> 
 <meta charset="UTF-8"> 
 <title></title> 
 <link rel="stylesheet" href="styles/demo.css" /> 
 </head> 
 
  <body> 
 
  <div id="app"> 
 
  <table> 
 <tr> 
 <th colspan="3">父组件数据</td> 
 </tr> 
 <tr> 
 <td>name</td> 
 <td>{{ name }}</td> 
 <td><input type="text" v-model="name" /></td> 
 </tr> 
 <tr> 
 <td>age</td> 
 <td>{{ age }}</td> 
 <td><input type="text" v-model="age" /></td> 
 </tr> 
 </table> 
 
  <my-component v-bind:my-name.sync="name" v-bind:my-age.sync="age"></my-component> 
 </div> 
 
  <template id="myComponent"> 
 <table> 
 <tr> 
 <th colspan="3">子组件数据</td> 
 </tr> 
 <tr> 
 <td>my name</td> 
 <td>{{ myName }}</td> 
 <td><input type="text" v-model="myName" /></td> 
 </tr> 
 <tr> 
 <td>my age</td> 
 <td>{{ myAge }}</td> 
 <td><input type="text" v-model="myAge" /></td> 
 </tr> 
 </table> 
 </template> 
 </body> 
 <script src="js/vue.js"></script> 
 <script> 
 var vm = new Vue({ 
 el: '#app', 
 data: { 
 name: 'keepfool', 
 age: 28 
 }, 
 components: { 
 'my-component': { 
 template: '#myComponent', 
 props: ['myName', 'myAge'] 
 } 
 } 
 }) 
 </script> 
 
  </html> 

单次绑定: 使用.once

代码语言:javascript
复制
<my-component v-bind:my-name.once="name" v-bind:my-age.once="age"></my-component>

修改了数据,也不会传导给子组件

代码语言:javascript
复制
 <!DOCTYPE html> 
 <html> 
 
  <head> 
 <meta charset="UTF-8"> 
 <title></title> 
 <link rel="stylesheet" href="styles/demo.css" /> 
 </head> 
 
  <body> 
 
  <div id="app"> 
 
  <table> 
 <tr> 
 <th colspan="3">父组件数据</td> 
 </tr> 
 <tr> 
 <td>name</td> 
 <td>{{ name }}</td> 
 <td><input type="text" v-model="name" /></td> 
 </tr> 
 <tr> 
 <td>age</td> 
 <td>{{ age }}</td> 
 <td><input type="text" v-model="age" /></td> 
 </tr> 
 </table> 
 
  <my-component v-bind:my-name.once="name" v-bind:my-age.once="age"></my-component> 
 </div> 
 
  <template id="myComponent"> 
 <table> 
 <tr> 
 <th colspan="3">子组件数据</td> 
 </tr> 
 <tr> 
 <td>my name</td> 
 <td>{{ myName }}</td> 
 <td><input type="text" v-model="myName" /></td> 
 </tr> 
 <tr> 
 <td>my age</td> 
 <td>{{ myAge }}</td> 
 <td><input type="text" v-model="myAge" /></td> 
 </tr> 
 </table> 
 </template> 
 </body> 
 <script src="js/vue.js"></script> 
 <script> 
 var vm = new Vue({ 
 el: '#app', 
 data: { 
 name: 'keepfool', 
 age: 28 
 }, 
 components: { 
 'my-component': { 
 template: '#myComponent', 
 props: ['myName', 'myAge'] 
 } 
 } 
 }) 
 </script> 
 
  </html> 

image.png

image.png

image.png

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档