写一个vue组件
写一个 vue 组件
我下面写的是以.vue 结尾的单文件组件的写法,是基于 webpack 构建的项目。如果还不知道怎么用 webpack 构建一个 vue 的工程的,可以移步到vue-cli。
一个完整的 vue 组件会包括一下三个部分:
- template:模板
- js: 逻辑
- css : 样式
每个组件都有属于自己的模板,js 和样式。如果将一个页面比喻成一间房子的话,组件就是房子里的客厅、卧室、厨房、厕所。如果把厨房单独拿出来的话,组件又可以是刀、油烟机... 等等。就是说页面是由组件构成的,而组件也可以是组件构成的。这样就可以非常的灵活,耦合性也非常的低。
首先来看看一个组件在不是在.vue 文件内的写法:
Vue.component('simple-counter', {
template: '<div id="inputBox"><input type="text"></div>',
data () { // 数据
return {
counter: 0
}
},
methods: {
// 写点方法
},
created () {
// 生命钩子
},
computed: {
// 计算属性
}
})
template 是用来干嘛的呢?
<template>
<div id="inputBox">
<input type="text">
</div>
</template>
<!--
template 就是这个组件的 html,也就是下面部分(vue-loader 会将 template 标签下的内容解析出来):
-->
<div id="inputBox">
<input type="text">
</div>
<!--
对应原生写法的话,就是 template 内的 dom 字符串
-->
js 部分
export default {
data () {
return {
counter: 0
}
},
methods: {
// 方法
},
created () {
// 生命钩子
},
computed: {
// 计算属性
}
}
// 在这里很明显 js 部分就是对应的原生写法内的非 template 部分了。
// export default 这个是 es6 的模块写法,不懂的可以先去了解 es6 的模块化
css 部分
<style lang="scss" scoped>
...样式
</style>
<!-- 这里的你可以使用 scss(CSS 扩展语言)只要安装 "sass-loader" 和 "node-sass" 这两个 npm 包就好了,vue-cli 已经配好相关参数了。如果想使用 less 或其它 css 扩展语音,只要装好各自的编译包就好了。而 scoped 是让 css 的作用域只在该文件下。-->
引入
要怎么在其它组件引用该组件?
组件一(button.vue)
<template>
<div class="button">
<button @click="onClick">{{text}}</button>
</div>
</template>
<script>
export default {
props: ['text'], // 获取父组件的传值
data () {
return {
}
},
methods: {
onClick () {
console.log('点击了子组件')
// 通过触发自定义事件修改父组件传递的 text
this.$emit('event1', '我修改了 text')
}
}
}
</script>
<style lang="scss" scoped>
.button {
button {
width: 100px;
}
}
</style>
组件二(box.vue)
<template>
<div class="box">
<v-button :text="text" ref="button" @event1="changeText"></v-button> <!-- 使用组件并传值(text)-->
</div>
</template>
<script>
import Button from './button.vue' // 引入子组件
export default {
components: {
'v-button': Button
},
data () {
return {
text: '按键的 name'
}
},
methods: {changeText (value) { // 自定义事件修改 text 的值
this.text = value
}
}
}
</script>
这里 box.vue 里引入了 button.vue 的组件,并通过 components 注册,在 box.vue 使用时只要使用注册时候的名称即可。
父组件向子组件传递数据
可以通过 prop 向子组件传值。
子组件和父组件的交互其实还有很多,例如子组件要怎么修改父组件传递的值?
因为 vue 的数据是单向的,所以子组件是不允许修改父组件的值的,官方是通过事件的形式修改的,就是父组件在子组件绑定一个自定义事件 v-on:event1="event1",
然后子组件通过 this.$emit('event1') 触发修改。可以理解为修改父组件传递的值一定要发生在父组件所在的作用域内。
父组件怎么获取子组件的实例
这里父组件可以在子组件定义 ref,在通过 this.$refs.xxx 获取对应的子组件实例。
而子组件可通过 this.$parent 获取父组件的实例。