写一个vue组件

写一个vue组件

我下面写的是以.vue结尾的单文件组件的写法,是基于webpack构建的项目。如果还不知道怎么用webpack构建一个vue的工程的,可以移步到vue-cli

一个完整的vue组件会包括一下三个部分:

  1. template:模板
  2. js: 逻辑
  3. 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获取父组件的实例。

posted @ 2018-04-09 12:47  syl95  阅读(10697)  评论(0编辑  收藏  举报