VUE单文件剖析

单个vue文件

 父组件:

    template部分:

  <div class="main-cell">
     <div class="line-charts-cell">
      <!-- 组件 -->
      <!-- :topInfo="xxx" 父作用域将数据传到子组件 -->
      <!-- v-前缀作为一种视觉提示,用来识别模版中vue特定的特性,在某些指令中提供了简写,
        比如v-bind缩写 <a v-bind:href="url">...</a> , <a:href="url"> ... </a>,
        比如v-on缩写 <a v-on:click="doSomething">...</a> <a @click="doSomething">...</a>
       -->
      <TopItem @handleRadio="handleRadioLineCharts" :topInfo="lineChartsInfo"></TopItem>
      <BaseChartDraw :chartOptions="lineChartsInfoOpt"></BaseChartDraw>
    </div>
    <div class="charts-cell">
      <div class="charts-item">
        <TopItem @handleRadio="handleRadioSumCharts" :topInfo="sumChartsInfo"></TopItem>
        <BaseChartDraw :chartOptions="sumChartsInfoOpt"></BaseChartDraw>
      </div>
      <div class="charts-item">
        <TopItem @handleRadio="handleRadioSortCharts" :topInfo="sortChartsInfo"></TopItem>
        <BaseChartDraw :chartOptions="sortChartsInfoOpt"></BaseChartDraw>
      </div>
      <div class="charts-item">
        <TopItem @handleRadio="handleRadioSumCharts2" :topInfo="sumChartsInfo2"></TopItem>
        <BaseChartDraw :chartOptions="sumChartsInfoOpt2"></BaseChartDraw>
      </div>
    </div>
  </div>

 

  script部分:

 // 导入组件  组件的命名方式
 import TopItem from "./components/TopItem";
 import BaseChartDraw from "./components/BaseChartDraw";

// 导入工具js import { getMoney } from
"../../utils/priceUtil.js";
export
default { // 在vue里,一个组件的本质上一个拥有预定义选项的vue实例,在vue中注册组件 components: { TopItem, BaseChartDraw } ... };

 

 

 子组件1  TopItem.vue

   template部分:

<div class="item-cell">
    <!-- 模版语法声明式地渲染DON -->
    <!-- 数据绑定到DOM文本或特性 Mustache语法,戏称小胡子语法 -->
    <!-- 对于所有的数据绑定,Vue.js都提供了完全的JavaScript表达式支持 -->
    <div class="item-name">{{topInfo.name}}</div>
    <div class="item-radio-cell">
      <!-- v-model 指令 实现表单输入和应用状态之间的双向绑定 -->
      <!-- 指令是带有v-前缀的特殊特性 ,指令的职责是当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM -->
      <!-- 
        v-bind指令可以响应式的更新HTML特性:
        <a v-bind:href="url">...</a>
        在这里href是参数,v-bind指令将该元素的href特性与表达式url的值绑定
       
        v-on指令可以监听DOM事件:
        <a v-on:click="doSomething">...</a> 在这里参数是监听的事件名
       -->
        <!-- 这里同时还涉及了Element UI的知识点 -->
         <!--  change 绑定值变化时触发的事件-->
       <el-radio-group v-model="radioValue" size="mini" @change="radioChange">
          <!-- v-model 指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。 -->
          <!-- v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。
               v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:
               text 和 textarea 元素使用 value 属性和 input 事件;
               checkbox 和 radio 使用 checked 属性和 change 事件;
               select 字段将 value 作为 prop 并将 change 作为事件。
           -->
          <!-- :指令的意思是该元素节点lable特性和item.value保持一致 -->
          <!-- v-for指令可以绑定数组的数据来渲染一个项目列表 -->
          <!-- 建议尽可能在使用 v-for 时提供key属性,它是 Vue 识别节点的一个通用机制,key 并不仅与 v-for 特别关联。 -->
          <!-- 不推荐在同一元素上使用 v-if 和 v-for -->
          <el-radio-button :label="item.value" v-for="(item,index) in topInfo.radioList" :key="index">{{item.name}}</el-radio-button>
          <!--  label Radio的value-->
          <!--  -->
        </el-radio-group>
    </div>
  </div>

 

  script部分:

export default{
    // 子单元通过pro接口与父单元进行良好的解耦
    props:{
      topInfo:{
        type:Object,
      }
    },
    // 当一个vue实例创建时,它将data对象中的所有属性加入到vue的响应式系统中。当这些属性的值发生变化时, 视图将会产生响应,即匹配新的值
    data(){
      return{
        radioValue:'1'
      }
    },
    // 每个vue实例在被创建时都要经过一系列的初始化过程,例如需要设置数据监听、编译模版、将实例挂载到DOM并在数据变化时
    // 更新DOM,
    // 同时在这个过程中也会执行一些叫做生命周期的钩子函数,这给了用户在不同阶段添加自己代码的机会。
    // created 钩子可以用来在一个实例被创建之后执行代码
    created() {
      this.radioValue = this.topInfo.radioList[0].value;
      this.$emit('handleRadio',{
        value:this.radioValue
      })
    },
    //  计算属性 是以解决页面中复杂逻辑运算
    //  关于计算属性和方法的比较在于缓存
    computed: {

    },
    //  不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())。因为箭头函数并没有 this
    methods:{
      radioChange(){
        this.$emit('handleRadio',{
          // 回调参数 选中的radio label的值
          value:this.radioValue
        })
      }
    },
  }

 

 

  子组件2:BaseChartDraw.vue

    template部分:

<div class="pic-cell">
    <div class="pic-item" ref="chartCell"></div>
 </div>

 

  script部分:

 import echarts from 'echarts';
  export default{
    props:{
      chartOptions:{
        type:Object,
      }
    },
// 自定义侦听器,vue通过watch选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化 // 时执行异步或开销较大的操作时,这个方式比较常用 watch:{ // 如果chartOptions发生变化,这个函数就会执行,使用 watch 选项允许我们执行异步操作 ,设置中间状态,等等。 chartOptions:{ deep:true, /**/ handler(nv,ov){ console.log(nv) this.drawChart(nv); } } }, methods:{ drawChart(options){ let temp = echarts.init(this.$refs.chartCell); temp.clear(); temp.setOption(options); } } }

 

posted on 2021-01-14 18:02  zhishiyv  阅读(122)  评论(0编辑  收藏  举报

导航