• 在vue2中使用饼状图


    1.引入vue2和echarts

    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>

    2.1 补充基本的body内容

    1. <div id="app">
    2. <input type="text" style="width: 100px;" placeholder="消费名称" v-model.trim="name">
    3. <input type="text"style="width: 100px;" placeholder="消费价格" v-model.number="price">
    4. <button @click="add(name,price)" >添加账单button><br>
    5. <table border="1px solid red" style="text-align: center;width: 300px;">
    6. <thead>
    7. <tr>
    8. <td>编号td>
    9. <td>消费名称td>
    10. <td>消费价格td>
    11. <td>操作td>
    12. tr>
    13. thead>
    14. <tbody>
    15. <tr v-for="(item,index) in list" v-on:key="item.id">
    16. <td>{{index+1}}td>
    17. <td>{{item.name}}td>
    18. <td>{{item.price}}td>
    19. <td> <p @click="del(item.id)">删除p>td>
    20. tr>
    21. tbody>
    22. table>
    23. <div style="width: 500px;height: 300px;border:2px solid red;" class="main">
    24. div>
    25. div>

    2.2补充基本的script内容

    1. <script>
    2. const l =[{id:1,name:'小黑',price:10},]
    3. const app =new Vue({
    4. el:"#app",
    5. data:{
    6. name:'',
    7. price:'',
    8. list: l,
    9. },
    10. methods:{},
    11. watch:{},
    12. mounted(){}
    13. })
    14. script>

       到现在展示的效果如下

    3.在methods中添加新增和删除的功能

    1. add(a,b){
    2. this.list.unshift({id:+new Date(),name:a,price:b})
    3. },
    4. del(a){
    5. this.list= this.list.filter(b=>b.id!==a)
    6. },

    这样我们的添加和删除的功能就可以实现了

    4.将修改后的内存持久化存储

      因为我们要对多个目标进行监听,所以需要使用watch的完整写法

    1. watch:{
    2. list:{
    3. deep:true,//深度监视
    4. handler(newValue){
    5. localStorage.setItem("list",JSON.stringify(newValue))
    6. } }
    7. } ,

     存储后前面的获取也需要修改,从本地获取并转成json格式

    JSON.parse(localStorage.getItem("list"))

      这样我们修改的后的数据就不会因为刷新浏览器而不存在了

    5.使用饼状图

       在钩子函数mounted渲染完成后添加echarts

    1. this.myChat= echarts.init(document.querySelector('.main'))
    2. this.myChat.setOption({
    3. title: {
    4. text: '小黑记事本',
    5. subtext: 'Fake Data', // 小标题
    6. left: 'center' ,
    7. },
    8. tooltip: {
    9. trigger: 'item' //提示框
    10. },
    11. legend: { //图例
    12. orient: 'vertical', //垂直
    13. left: 'left'
    14. },
    15. series: [
    16. {
    17. name: '消费账单',
    18. type: 'pie',
    19. radius: '60%',
    20. data: this.list.map(item=>({value:item.price,name:item.name})),
    21. emphasis: {
    22. itemStyle: {
    23. shadowBlur: 10,
    24. shadowOffsetX: 0,
    25. shadowColor: 'rgba(0, 0, 0, 0.5)'
    26. }
    27. }
    28. }
    29. ]
    30. }
    31. )

    这样我们就可以清晰的看到各项数据的占比,但是这是我们在渲染完成后才会刷新,所以需要我们重新定义一个方法在每次添加和删除之后进行调用来实时更新饼状图

    5.1更新饼状图的方法

    1. a(){
    2. this.myChat.setOption(
    3. {
    4. series: [ {
    5. data: this.list.map(item=>({value:item.price,name:item.name})),
    6. } ]
    7. })
    8. }

     

     

     完整代码如下

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js">script>
    7. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">script>
    8. <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js">script>
    9. head>
    10. <body>
    11. <div id="app">
    12. <input type="text" style="width: 100px;" placeholder="消费名称" v-model.trim="name">
    13. <input type="text"style="width: 100px;" placeholder="消费价格" v-model.number="price">
    14. <button @click="add(name,price)" >添加账单button><br>
    15. <table border="1px solid red" style="text-align: center;width: 300px;">
    16. <thead>
    17. <tr>
    18. <td>编号td>
    19. <td>消费名称td>
    20. <td>消费价格td>
    21. <td>操作td>
    22. tr>
    23. thead>
    24. <tbody>
    25. <tr v-for="(item,index) in list" v-on:key="item.id">
    26. <td>{{index+1}}td>
    27. <td>{{item.name}}td>
    28. <td>{{item.price}}td>
    29. <td> <p @click="del(item.id)">删除p>td>
    30. tr>
    31. tbody>
    32. table>
    33. <div style="width: 500px;height: 300px;border:2px solid red;" class="main">
    34. div>
    35. div>
    36. <script>
    37. const msg = [
    38. {id:1,name:"手表",price:299.00},
    39. {id:2,name:"大衣",price:599.00},
    40. {id:3,name:"球鞋",price:299.00},
    41. {id:4,name:"鸭舌帽",price:99.00}
    42. ]
    43. var list1 = JSON.parse(localStorage.getItem("list"))
    44. const app =new Vue({
    45. el:"#app",
    46. data:{
    47. name:"",
    48. price:"",
    49. list:list1||msg
    50. },
    51. methods:{
    52. add(a,b){
    53. console.log(a)
    54. if(a==null || a==""){alter("请您添加消费名称")}
    55. this.list.unshift({id:+new Date(),name:a,price:b})
    56. this.a()
    57. },
    58. del(a){
    59. this.list= this.list.filter(b=>b.id!==a)
    60. this.a()
    61. },
    62. a(){
    63. this.myChat.setOption(
    64. {
    65. series: [ {
    66. data: this.list.map(item=>({value:item.price,name:item.name})),
    67. } ]
    68. })
    69. }
    70. },
    71. watch:{
    72. list:{
    73. deep:true,//深度监视
    74. handler(newValue){
    75. localStorage.setItem("list",JSON.stringify(newValue))
    76. } }
    77. } ,
    78. mounted(){//渲染后
    79. this.myChat= echarts.init(document.querySelector('.main'))
    80. this.myChat.setOption({
    81. title: {
    82. text: '小黑记事本',
    83. subtext: 'Fake Data', // 小标题
    84. left: 'center' ,
    85. },
    86. tooltip: {
    87. trigger: 'item' //提示框
    88. },
    89. legend: { //图例
    90. orient: 'vertical', //垂直
    91. left: 'left'
    92. },
    93. series: [
    94. {
    95. name: '消费账单',
    96. type: 'pie',
    97. radius: '60%',
    98. data: this.list.map(item=>({value:item.price,name:item.name})),
    99. emphasis: {
    100. itemStyle: {
    101. shadowBlur: 10,
    102. shadowOffsetX: 0,
    103. shadowColor: 'rgba(0, 0, 0, 0.5)'
    104. }
    105. }
    106. }
    107. ]
    108. }
    109. )
    110. },
    111. })
    112. script>
    113. body>
    114. html>

  • 相关阅读:
    以技术面试官的经验分享毕业生及三年以下的程序员通过面试的技巧
    ParameterizedType类型设置默认值
    ubuntu20.04下安装nc
    【MySQL】数据类型——MySQL的数据类型分类、数值类型、小数类型、字符串类型
    tomcat常用配置详解和优化方法
    2023年7月工作经历三
    CentOS 7 上划分vlan复用接口配置多个ip地址——筑梦之路
    go设计模式——适配器模式 2
    《ClickHouse原理解析与应用实践》读书笔记(2)
    Matlab|基于多目标粒子群算法的微电网优化调度(多约束多目标智能算法模板)
  • 原文地址:https://blog.csdn.net/weixin_68926017/article/details/136407173