Vue开发系列——自定义组件开发

目录

一、组件开发优势

二、组件开发步骤

步骤1、编写组件代码

[步骤2、 子组件注册](#步骤2、 子组件注册)

局部注册

全局注册

步骤3、父组件给自定义的组件传参并调用

三、总结


一、组件开发优势

组件化开发允许你构建可重用、可维护的代码模块,这些模块可以单独测试和组合使用。

二、组件开发步骤

步骤1、 编写组件代码

步骤2、注册组件(全局注册、局部注册)

步骤3、使用组件

步骤1、编写组件代码

组件的.vue文件中,可以定义模板、脚本和样式。 例如,开发一个显示柱状图的组件。其中,X轴数据、Y轴数据由父组件传入,子组件主要负责画出如下的柱状图:

子组件定义位置 serviceCompents/Course/chart.vue,定义的内容如下:

javascript 复制代码
<template>
  <div>
    <el-button type="primary" @click="startGenEcharts()">刷新图表</el-button>
    <div class="echart" id="mychart" :style="myChartStyle"></div>
  </div>
</template>
<script>

import * as echarts from 'echarts';

export default {
    name: 'CourseChart',
    props: {
        dataX: {
            type: Array
          },
        dataY: {
          type: Array
        }
    },
    data(){
        return {
          myChartStyle: { float: "left", width: "100%", height: "300px" }, //图表样式
        }
    },
    methods: {
      startGenEcharts() {
        let dataX = this.dataX;
        let dataY =  this.dataY;

        let colorList = ['#0CB500', '#FFD634', '#01DAE2', '#FF5555', '#03B8DE', '#4AE879', '#FF8800', '#DBDBDB', '#ABEAFF'];
       var  myoption = {
          fontSize: 8,
            tooltip: {
            trigger: 'axis'
          },
          grid: {
            left: 0, //左边距
              right: 0, //走边距
              top: 15, //上边距
              bottom: 0, //下边距
              containLabel: true
          },
          xAxis: {
            name: '不及格率',//x轴名称
            nameLocation: 'middle', // 控制名字的位置,如 'start' 或 'middle'
            nameGap: 20,
            nameTextStyle: {
              fontSize: 15,
              color: 'red'
            },
            type: 'category',
            boundaryGap: [0, '30%'],
            //坐标轴斜着显示
              axisLabel: {
              interval: 0,
                rotate: 20,
                fontSize: 18
            },
            axisLine: {
              //x轴
              show: false, //线条隐藏
                lineStyle: {
                //文字颜色
                color: '#333'
              }
            },
            axisTick: {
              //y轴刻度线
              show: false
            },
            data: dataX
          },
          yAxis: {
            name: '平均分', // 直接在 yAxis 配置中设置 name,显示在坐标轴旁边(对于 category 类型)或下方(对于 value 类型)
            nameTextStyle: { // 定制坐标轴名称的样式
              color: 'red',
              fontSize: 15,
              fontWeight: 'bold'
            },
            nameLocation: 'start', // 可以是 'start' 或middle 'end',表示名称在坐标轴的开始或结束位置
            nameRotate: 0, //0或90 旋转角度,默认是水平方向,如果想让名称垂直显示可以设置旋转角度
            nameGap: 15, // 名称与坐标轴线之间的距离
            type: 'value',
              boundaryGap: [0, '30%'],
              axisLine: {
              //y轴
              show: false, //线条隐藏
                lineStyle: {
                //文字颜色
                color: '#333'
              }
            },
            axisLabel: {
              fontSize: 18
            },
            //网格线颜色
            splitLine: {
              show: true,
                lineStyle: {
                color: ['#307DCB'],
                  width: 1,
                  type: 'solid'
              }
            },
            axisTick: {
              //y轴刻度线
              show: false
            }
          },
          series: [
            {
              name: '平均成绩',
              data: dataY,
              type: 'bar',
              itemStyle: {
                normal: {
                  color: function (params) {
                    return colorList[params.dataIndex];
                  },
                  label: {
                    show: true, //开启显示
                    position: 'top', //在上方显示
                    textStyle: {
                      //数值样式
                      color: '#333',
                      fontSize: 18
                    }
                  }
                }
              }
            }
          ]
        };
        this.myChart = echarts.init(document.getElementById("mychart"));
        this.myChart.setOption(myoption);
        //随着屏幕大小调节图表
        window.addEventListener("resize", () => {
          this.myChart.resize();
        });
      }

    },
    mounted(){
      this.startGenEcharts();
    }
}
</script>
<style scoped>
.run-box{
    margin-bottom: -1px;
    padding: 4px 8px;
    border: 1px solid #dcdfe6;
    border-radius: 3px;
}

</style>

注意:

1、 使用Props传递数据到组件。比如示例中有如下定义,表示将从外部向组件传入dataX, dataY两个Array类型的数据

复制代码
props: {
    dataX: {
        type: Array
      },
    dataY: {
      type: Array
    }
}

步骤2、 子组件注册

注册组件(全局注册、局部注册)

局部注册

父组件.vue文件中:

import CourseChart from '@src/serviceComponents/Course/chart';//子组件定义位置

export default {

name: "courseScoreOverviewList",

components: {
CourseChart
},

data() {

return {

...此时省略内容

全局注册

import Vue from 'vue';

import App from './App.vue';

import CourseChart from '.@src/serviceComponents/Course/chart';// 具体路径添加上.vue也可以Vue.component('CourseChart', CourseChart);

new Vue({

render: h => h(App),

}).$mount('#app');

步骤3、父组件给自定义的组件传参并调用

注意: 通过props在父组件和子组件之间传递数据.++实际上用于父组件给子组件传递数据++

父组件.vue文件内容:

javascript 复制代码
<el-dialog title="成绩分析" :visible.sync="dialogVisibleForEcharts" fullscreen>
  <div style="margin-left: 80px; margin-bottom: 60px;">
    <CourseChart :dataY="this.list.map(item => toFixed(item.avgStuScores),2)" :dataX="this.list.map(item => toFixed(item.totalFailStuScoresRate,2))"></CourseChart>
  </div>

</el-dialog>


import CourseChart from '@src/serviceComponents/Course/chart';//子组件定义位置

export default {
  name: "courseScoreOverviewList",
  components: {
     CourseChart
  },
  data() {
    return {
...此时省略内容

注意:在子组件中,你可以使用$emit触发事件,并在父组件中监听这些事件。

三、总结

1、 子组件可以继续组合形成更大的子组件来使用

2、 父组件可以通过props给子组件传递数据。 数据的类型可以多种多样.比如,

  • 当父组件通过props给子组件传递Array数据时,子组件声明:
复制代码
props: {
    dataX: {
        type: Array
      },
    dataY: {
      type: Array
    }
}
  • 当父组件通过props给子组件传递字符串、整形等基本数据时,子组件声明:
复制代码
props: ['productId', 'taskId', 'resultId']
  • 当父组件通过props给子组件传递Object数据时,子组件声明:

props: {

dataX: {

type: Object

}

}

相关推荐
用户250694921612 小时前
next框架打包.next文件夹部署
前端
程序猿小蒜2 小时前
基于springboot的校园社团信息管理系统开发与设计
java·前端·spring boot·后端·spring
一叶难遮天2 小时前
开启RN之旅——前端基础
前端·javascript·promise·js基础·es6/ts·npm/nrm
申阳2 小时前
Day 4:02. 基于Nuxt开发博客项目-整合 Inspira UI
前端·后端·程序员
程序猿_极客2 小时前
【期末网页设计作业】HTML+CSS+JavaScript 猫咪主题网站开发(附源码与效果演示)
前端·css·html·课程设计·网页设计作业
IT古董2 小时前
【前端】从零开始搭建现代前端框架:React 19、Vite、Tailwind CSS、ShadCN UI 完整实战教程-第1章:项目概述与技术栈介绍
前端·react.js·前端框架
有点笨的蛋2 小时前
从零搭建小程序首页:新手也能看懂的结构解析与实战指南
前端·微信小程序
爱宇阳2 小时前
Vue3 前端项目 Docker 容器化部署教程
前端·docker·容器
Irene19912 小时前
前端缓存技术和使用场景
前端·缓存