Vue.js 组件

1.组件的建立

vue的组件就是一个个vue文件,里面包含3个部分:
template:html模版
style:css样式
script:js代码css

<template>
    <!-- 只能有一个根标签 -->
    <div>
        <p>{{msg}}</p>
    </div>
</template>

// lang表示所使用的CSS 预处理语言
// scoped表示里面的样式做用范围此局限在此组件中
<style lang="less" scoped>
    p{
        color:green
    }
</style>

<script>
export default{
    data(){
      return{
          msg:'hello wolrd'
      }
    },
    methods:{
    }
}
</script>

2.组件的引用

在父组件的script标签中使用import引入相关组件的vue文件,并注册到components对象中html

// App.vue
<script>
import Hello from './components/Hello.vue'
export default {
    data() {
        return {
            
        }
    },
    components: {
        Hello
    }
}
</script>

以后能够以标签的形式在模版中使用此Hello组件vue

<template>
<div>
    <Hello />
</div>
</template>

组件传值

3.props传值

(1)在父组件中把要传递的数据经过属性的形式绑定到子组件标签上
(2)在子组件中经过props属性接收父组件传递的数据(属性名是什么,接收的名称就是什么)npm

父组件:app

<template>
<div id="app">
    <h1>App组件</h1>
    <child :msg="msg" :person="person" :list="list"></Child>
</div>
</template>

<script>
import Child from "./components/Child.vue"

export default {
  data() {
    return {
      msg:"我是父组件传递的值",
      person:{name:"张三丰",age:108},
      list:['苹果','西瓜','桃子']
    }
  },
  components: {
    Child
  }
}
</script>

子组件:less

<template>
  <div>
    <P>{{msg}}</P>
    <p>{{person.name}}--{{person.age}}</p>
    <ul>
      <li v-for="(item,index) in list" :key="index">{{item}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data () {
    return {
      
    }
  },
  props:['msg','person','list']
}
</script>

props接收父组件传递的数据有2种语法:简单语法和对象语法函数

//简单语法
props:['msg','person','list']
//对象语法,会检测传递值的数据类型
props:{
    msg:String,
    list:Array,
    person:Object
},

4.自定义事件

自定义事件能够将父组件的某个函数暴漏给子组件,子组件能够经过特定的方式来调用这个函数,并以传参的形式将子组件的数据传递给父组件
(1)在父组件中经过v-on的形式绑定一个自定义事件到子组件标签上,并设置自定义事件触发时的回调
(2)子组件经过this.$emit()方法来触发该自定义事件,并传入相应的参数给回调函数this

//父组件 
//eventName为自定义事件的名称
//showMsg为mthods中定义的方法
<child @eventName="showMsg"></Child>
//子组件使用this.$emit()触发自定义事件
this.$emit('eventName',this.content)

还能够使用js语法来为自组件绑定自定义事件
语法:$on('事件名称',回调函数)code

//设定子组件标签的ref标识
<child ref="child"></Child>
//经过ref标识找到子组件,并为其添加子定义事件
mounted(){
    this.$refs.child.$on('eventName',this.showMsg)
}

5.订阅和发布

经过第三方库来进行组件通讯,例如pubsub-js,使用这个库能够让任意两个组件进行通讯
订阅:PubSub.subscribe('事件名称', 回调函数);
发布:PubSub.publish('事件名称', 传递的参数);component

安装pubsub-js

npm install pubsub-js -S

引入pubsub-js (订阅和发布的组件都须要引入

import PubSub from 'pubsub-js'

组件1添加订阅(至关于添加事件监听)

<script>
import PubSub from 'pubsub-js'
export default {
  data () {
    return {
      content:""
    }
  },
  mounted(){
    //在回调函数中添加订阅
    PubSub.subscribe('eventName', (eventName,data)=> {
      //参数一是固定的,为事件名称
      //参数二才是传递的参数
      console.log(eventName,data)
      this.handleClick(data)
    })
  },
  methods:{
    handleClick(data){
      this.content = data
    }
  }
}
</script>

组件2发布消息(至关于触发事件监听)

<script>
export default {
  data () {
    return {
      content:"我是传递的参数"
    }
  },
  methods:{
    handleClick(){
      //发布(触发事件监听)
      PubSub.publish('eventName', this.content);
    }
  }
}
</script>
相关文章
相关标签/搜索