组件

  • 将公用的功能抽离出来,形成组件;目的:复用代码。

1.1 全局组件

<div id="app">

    <!--引用组件,可多次引用-->
<demo></demo> </div> <script src="../js/vue.js"></script> <script>
// 全局组件,第一个参数:自定义名称,第二个:{ }
Vue.component('demo',{
// 接收的是字符串
// 已完成组件的注册
template:'<h1>test</h1>'
}) new Vue({
el:'#app'
})
</script>
</body>

我们可以看到,现在前端在div中所显示的是【<h1>test</h1>】,而我们在源码中是【<demo></demo>】,所以<demo></demo>就是我们所创建的全局组件demo,当我们引用时,就会显示【template】定义的值

1.2全局组件中的data使用

<body>
<div id="app"> <!--引用组件-->
<demo></demo> </div> <script src="../js/vue.js"></script> <script>
// 全局组件,第一个参数:自定义名称,第二个:{ }
Vue.component('demo',{
// 接收的是字符串
// 已完成组件的注册
template:'<h1>msg</h1>',
// 组件中的data,必须是个方法,如是dict,当有改动时,其他页面有同时在使用的同时也会改变,使用了方法后,因作用域限制,只会作用于vue,其他数据不会变化
data:function () {
return{
msg:'msg'
}
}
}) new Vue({
el:'#app'
})
</script>
</body>

效果展示:

1.3全局组件中methods的绑定使用

<body>
<div id="app"> <!--引用组件-->
<demo></demo>
<demo></demo> </div> <script src="../js/vue.js"></script> <script>
// 全局组件,第一个参数:自定义名称,第二个:{ }
Vue.component('demo',{
// 接收的是字符串
// 已完成组件的注册
template:'<h1 @click="change">{{msg}}</h1>',
// 组件中的data,必须是个方法
data:function () {
return{
msg:'msg'
}
},
methods:{
change:function () {
this.msg = 'test'
}
}
}) new Vue({
el:'#app',
})
</script>
</body>

前端页面默认显示:

点击:第一个【msg】后显示:

1.4 全局组件定义后被引用

<body>
<div id="app"> <test></test> </div> <script src="../js/vue.js"></script>
<script> Vue.component('test',{
template:'<div><span>全局组件:{{number}}</sapn>\</div>',
data:function () {
return{
number: 0
}
}
}) new Vue({
el:'#app',
data:{
},
methods:{
}
})
</script>
</body>

展示:

2、$refs

  • 主要应用于有组件时

this.$refs:获取resf的属性,属性就是当前页面:所有定义了ref属性的这一个标签,等同于document.getElementById()

<body>
<div id="app"> <div ref="test"></div>
<input type="button" value="test" @click="change"> </div> <script src="../js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{ },
methods:{
change:function () {
// 获取resf的属性,属性就是当前页面:所有定义了ref属性的这一个标签
console.log(this.$refs)
} }
}) </script>
</body>

前端展示:

2.1 this.$refs.xxx

<body>
<div id="app"> <div id="i1" ref="test">ref=test</div>
<input type="button" value="test" @click="change"> </div> <script src="../js/vue.js"></script>
<script>
new Vue({
el:'#app',
data:{ },
methods:{
change:function () {
// 获取resf的属性,属性就是当前页面:所有定义了ref属性的这一个标签
// this.$refs.test相当于是document.getElementById('i1')
console.log('this.$refs.test--->',this.$refs.test)
console.log("document.getElementById('i1')--->",document.getElementById('i1'))
} }
}) </script>
</body>

2.2 refs属性使用后所携带的方法

<body>
<div id="app"> <test ref="a"></test>
<input type="button" value="test" @click="change"> </div> <script src="../js/vue.js"></script>
<script> Vue.component('test',{
template:'<div><span @click="add">子组件:{{number}}</sapn>\</div>',
data:function () {
return{
number: 0
}
},
methods: {
add:function () {
// number++: 表示每次+1
this.number++
}
}
}) new Vue({
el:'#app',
data:{
count:0
},
methods:{
change:function () {
console.log('this.$refs--->',this.$refs)
} }
}) </script>
</body>

可以拿到number,这么一来,我们就可以获取到number:

    new Vue({
el:'#app',
data:{
count:0
},
methods:{
change:function () {
console.log('this.$refs.a.number--->',this.$refs.a.number)
} }
})

通过绑定ref属性,如果是组件,就可以获取到全局组件中data定义的数据

2.3 通过获取 ref 中number 实现运算

<body>
<div id="app"> <test ref="a"></test>
<test ref="b"></test>
<div>父组件:<span>{{count}}</span></div>
<input type="button" value="test" @click="change"> </div> <script src="../js/vue.js"></script>
<script> Vue.component('test',{
//绑定add后,每次点击会+1
template:'<div><span @click="add">子组件:{{number}}</sapn>\</div>',
data:function () {
return{
number: 0
}
},
methods: {
add:function () {
// number++: 表示每次+1
this.number++
}
}
}) new Vue({
el:'#app',
data:{
count:0
},
methods:{
change:function () {
// this.$refs.a.number:获取到a的number值
this.count = this.$refs.a.number +this.$refs.b.number
} }
}) </script>
</body>

3、is规避错误

  • 组件化时,如果一个元素是由多个标签组成,内部标签想要组件化,不可以直接使用

<body>
<div id="app">
<table border="1">
<thead>
<th>id</th>
<th>请求方式</th>
<th>状态</th>
</thead>

<tbody>
<tr-demo></tr-demo>
</tbody>

</table>
</div> <script src="../js/vue.js"></script> <script>
// 创建全局组件
Vue.component('tr-demo', {
template: '<tr><td>1</td><td>post</td><td>失败</td></tr>'
}) new Vue({
el: '#app'
}) </script>
</body>

使用is后:

<body>

<div id="app">

    <table border="1">
<thead>
<th>id</th>
<th>请求方式</th>
<th>状态</th>
</thead> <tbody>
<!--is="tr-demo":表示此标已经不是Ta本身了,而是组件“tr-demo”-->
<tr is="tr-demo"></tr>
</tbody> </table> </div> <script src="../js/vue.js"></script> <script>
// 创建全局组件
Vue.component('tr-demo', {
template: '<tr><td>1</td><td>post</td><td>失败</td></tr>'
}) new Vue({
el: '#app'
}) </script>
</body>

4、局部组件

<body>
<div id="app">
<!--引用局部组件-->
<demo-key></demo-key> </div> <script src="../js/vue.js"></script> <script> new Vue({
el: '#app',
// 局部组件
components: {
// 创建组件后,给组建起个名称,得是:"key":{}
"demo-key": {
// 绑定@click='change‘,后每次点击:+1
template: "<h1 @click='change'>{{msg}}</h1>",
data: function () {
return {
msg: 0
}
},
methods: {
change:function() {
this.msg++
}
}
},
// 可创建多个局部组件
"h2-demo":{ }
}
})
</script>
</body>

全局组件与局部组件的区别是:全局组件都可以使用,而局部组件是只可以在本实例中使用


最新文章

  1. 为什么要用 WebSocket
  2. 对Hibernate的理解
  3. Linux下*.tar.gz文件解压缩命令
  4. Chrome 控制台不完全指南【转载】
  5. webView 加载本地文件 - html/htm pdf docx tx
  6. C#基础知识-对象初始化顺序
  7. v$session_wait p1 p1raw p1_16
  8. C++编程规范之12:懂得何时和如何进行并发性编程
  9. 我的Python成长之路---第七天---Python基础(22)---2016年2月27日(晴)
  10. 14.2.5.1 Role of the .frm File for InnoDB Tables InnoDB .frm文件的作用
  11. apache和nginx原理上的不同之处
  12. Fiddler捕获localhost的网站
  13. Hadoop 伪分布式安装、运行测试例子
  14. activty栈管理
  15. XML 处理利器 : XStream
  16. 通过命令修改mysql的提示符
  17. 小乌龟 coding 克隆、提交一直提示无权限
  18. Android MediaCodec 状态(States)转换分析
  19. NATS—基础介绍
  20. div容器中内容垂直居中

热门文章

  1. 【SSO单点系列】(9):CAS4.0 之客户端排除不需要过滤的路径
  2. Servlet中使用request转发页面引发的500空指针异常
  3. QT--QMainWindow窗口的状态栏设置
  4. svn ssh方式避免每次输入密码
  5. 16.java八皇后问题
  6. desginer启动就直接卡死
  7. python打包生成exe报错
  8. Ginan-PEA例程下载
  9. Babel与webpack
  10. Jmeter 命令执行脚本并输出报告