Vue组件化(组件通信,自定义组件)

自定义组件

1.创建.vue文件

<template>
  <div class="nav-body">
      <div class="navs">
          <div>首页</div>
          <div>新闻</div>
          <div>动态</div>
          <div>联系我们</div>
      </div>
  </div>
</template>

<script>
export default {
    
    

}
</script>

<style scoped>
.nav-body{
    
    
    width: 100%;
    height: 80px;
    background: #eee;
}
.navs{
    
    
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
}
.navs div{
    
    
    margin: 0px 10px;
}
</style>

2.在父组件中引入自定义组件

<script>
import Header from './views/Header'
export default {
    
    

}
</script>

3.在父组件中注册子组件

<script>
import Header from './views/Header'
export default {
    
    
  components:{
    
    
    'el-header': Header
  }
}
</script>

4.在父组件中使用子组件

<template>
  <div>
     <el-header></el-header>
  </div>
</template>

<script>
import Header from './views/Header'
export default {
    
    
  components:{
    
    
    'el-header': Header
  }
}
</script>

组件通信

1.父组件向子组件传值

App.vue代表父组件,代码如下:

在父组件中使用自定义组件标签时,在标签上声明的属性就是要传递的参数名,标签上属性的值就是要传递的具体值,自定义标签的属性可以使用
v-bind 修饰。

<template>
  <div>
     <el-header name="tom" :show="true"></el-header>
  </div>
</template>

<script>
import Header from './views/Header'
export default {
    
    
  components:{
    
    
    'el-header': Header
  }
}
</script>

在子组件中使用 props 选项接收外界的传值,代码如下:

<template>
  <div>
      <div v-show="show">
        Header.vue,获取父组件传值:{
    
    {
    
    name}}</div>
  </div>
</template>

<script>
export default {
    
    
    props:{
    
    
        name: String,
        show: Boolean
    }
}
</script>

2.子组件向父组件传值

在App.vue中使用子组件标签时,自定义一个事件

<template>
  <div>
  	<!-- @hello就是自定义的事件名称 -->
     <el-header name="tom" :show="true" @hello="handleClick"></el-header>
  </div>
</template>

在子组件中,触发自定义的事件

<template>
  <div>
  			//触发自定义的事件,想用什么事件触发,就写什么事件,比如点击事件,移入移出事件等。
      <div v-show="show" @click="clickDiv">
        Header.vue,获取父组件传值:{
    
    {
    
    name}}</div>
  </div>
</template>

<script>
export default {
    
    
    props:{
    
    
        name: String,
        show: Boolean
    },
    methods: {
    
    
        clickDiv(){
    
     //点击事件函数,假如我们要在此处触发自定义的 hello 事件
            //在子组件中声明一个变量
            let i = 11
            //使用vue实例上的 $emit() 函数触发,该函数的参数1为要触发的事件名称,参数2为事件名称上绑定的函数传参
            this.$emit('hello',i)
        }
    }
}
</script>

当点击父组件中间的子组件标签时,即触发了绑定的事件函数

	<template>
  <div>
     <el-header name="tom" :show="true" @hello="handleClick"></el-header>
  </div>
</template>

<script>
import Header from './views/Header'
export default {
    
    
  components:{
    
    
    'el-header': Header
  },
  methods: {
    
    
    handleClick(i){
    
    
      //在执行父组件中的事件函数时获取参数
      console.log('点击。。。。',i)
    }
  }
}
</script>

封装自定义组件

1.封装输入框组件

<template>
  <div>
      <input type="text" @keypress.enter="enter" v-model="value" >
      <span v-show="clearBtn">
        <span class="clear" v-show="isClear" @click="value = ''">×</span>
      </span>
  </div>
</template>

<script>
export default {
    
    
    props: {
    
    
        clearBtn: Boolean
    },
    data(){
    
    
        return {
    
    
            value: '',
            isClear: false
        }
    },
    watch: {
    
    
        value(val){
    
    
            if(val.length > 0){
    
    
                this.isClear = true
            }else{
    
    
                this.isClear = false
            }
        }
    },
    methods: {
    
    
        enter(){
    
    
            this.$emit('enter',this.value)
        }
    }
}
</script>

<style>
.clear{
    
    
    margin-left: -20px;
    cursor: pointer;
}
</style>

2.封装按钮组件

<template>
  <div>
      <button :style="{color: fontColor, backgroundColor: bgColor}" @click="clickBtn">{
    
    {
    
    text}}</button>
  </div>
</template>

<script>
export default {
    
    
    props:{
    
    
        text: String,
        fontColor: String,
        bgColor: String
    },
    methods:{
    
    
        clickBtn(){
    
    
            this.$emit('click')
        }
    }
}
</script>

3.使用自定义的样式组件

<template>
  <div>
     <el-input @enter="handleSubmit" :clearBtn="false"></el-input>
     <el-button @click="handleClick" text="提交" fontColor="blue" bgColor="red"></el-button>
  </div>
</template>

<script>
import Input from './views/Input'
import Button from './views/Button'
export default {
    
    
  components:{
    
    
    'el-input': Input,
    'el-button': Button
  },
  methods: {
    
    
    handleClick(){
    
    
      console.log('abc...')
    },
    handleSubmit(val){
    
     // 设计一个默认参数val,在按下回车时自动获取到输入框的值
      console.log('提交...',val)
    }
  }
}
</script>

猜你喜欢

转载自blog.csdn.net/qq_45021462/article/details/109559182