写一个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获取父组件的实例。

原文地址:https://www.cnblogs.com/suyuanli/p/8759066.html

时间: 2024-12-11 14:07:52

写一个vue组件的相关文章

【转】从零开始开发一个vue组件打包并发布到npm (把vue组件打包成一个可以直接引用的js文件)

自己写的组件 有的也挺好的,为了方便以后用自己再用或者给别人用,把组件打包发布到npm是最好不过了,本次打包支持 支持正常的组件调用方式,也支持Vue.use, 也可以直接引用打包好的js文件, 配合vue.js 就不需要webpakc这种构建工具了,可以直接在页面内使用,下面以 ‘yyl-npm-practice’ 这个包为例 第一步:使用 vue init webpack-simple yyl-npm-practice   初始化项目 提示: 不要用 vue init webpack npm

【转】制作并发布第一个vue组件的npm包

最近在网上找到一个网页制作辅助工具-jQuery标尺参考线插件,觉得在现在的一个项目中能用的上,插件是基于JQuery的,但是现在的项目是用vue写的.So...,就照葫芦画瓢改装成了Vue组件,总的来说算是一个用处较多的组件,于是乎,就想着把它上传到Npm上分享出来.以前只用过别人的包,这一次自己上传一个乐呵乐呵...顺便记录发布一下过程. 项目地址 https://github.com/gorkys/vue... 初始化项目 这里用的是webpack-simple,可以理解为精简版的vue-

在React中写一个Animation组件,为组件进入和离开加上动画/过度

问题 在单页面应用中,我们经常需要给路由的切换或者元素的挂载和卸载加上过渡效果,为这么一个小功能引入第三方框架,实在有点小纠结.不如自己封装. 思路 原理 以进入时opacity: 0 --> opacity: 1 ,退出时opacity: 0 --> opacity: 1为例 元素挂载时 挂载元素dom 设置动画opacity: 0 --> opacity: 1 元素卸载时 设置动画opacity: 0 --> opacity: 1 动画结束后卸载dom 组件设计 为了使得组件简

如何写一个vue指令directive

举个例子 :clickoutside.js const clickoutsideContext = '@@clickoutsideContext'; export default { /* @param el 指令所绑定的元素 @param binding {Object} @param vnode vue编译生成的虚拟节点 */ bind (el, binding, vnode) { const documentHandler = function(e) { console.log(el) c

React Native学习(四)—— 写一个公用组件(头部)

本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-Demo 一.总览 头部通常分为左.中.右三部分,效果图如下: 二.头部组件 1.创建components文件夹,新建commonHead.js 2.commonHead.js 头部分为左.中.右三块,我们需要提供接口,获取外部传入的值,从而判断哪一块需要创建. static propTypes =

仿照admin写一个startk组件

settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'app02.apps.App02Config', 'star

学习如何写一个vue插件【入门篇】

#### 疑答 1.市面上已经有那么多插件可用,为什么还要造轮子?学习.借鉴思想.应用到开发 2.能否在项目中使用?与网上插件使用相同   更新维护问题怎么解决? 自身动力,使用者反馈等 #### 准备工具 1.官方文档https://cn.vuejs.org/v2/guide/plugins.html2.github.npm网站账号.node/npm.git3.代码工具:vscode #### 过程1.新建文件夹 vue-loading-text npm init 初始化 2.代码工具:vsc

Vue组件的三种调用方式

最近在写fj-service-system的时候,遇到了一些问题.那就是我有些组件,比如Dialog.Message这样的组件,是引入三方组件库,比如element-ui这样的,还是自己实现一个?虽然它们有按需引入的功能,但是整体风格和我的整个系统不搭.于是就可以考虑自己手动实现这些简单的组件了. 通常我们看Vue的一些文章的时候,我们能看到的通常是讲Vue单文件组件化开发页面的.单一组件开发的文章相对就较少了.我在做fj-service-system项目的时候,发现其实单一组件开发也是很有意思

vue组件的创建

vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例中使用组件吧! 这里有一个Vue组件的示例: Vue.component('Vheader',{ data:function(){ return { } }, template:`<div class="header"> <div class="w"> <