Vue2.x-01点击按钮弹出子Vue组件,遍历JSON展示数据

简介: Vue2.x-01点击按钮弹出子Vue组件,遍历JSON展示数据

概述


20181212202423664.gif

需求:需要在先有的页面上增加一个“查看处理人”的按钮,点击查看处理人,弹出子组件,将参数传递给子组件,初始化的时候created方法中发送请求到后台,接收到后台返回的JSON数据后,解析JSON展示到页面上。

下面的描述可能不正确,刚接触Vue2.x ,请多见谅


实现过程

使用的组件库是iView2.x版本。


Step1: 父组件设置Button按钮


20181212204441391.png


Step2: 这里使用了showHandlerFlag来控制子组件是否显示,所里需要在data中定义下这个变量


20181212204559661.png


data可以理解为存放本Vue组件中使用的变量的地方

https://cn.vuejs.org/v2/api/#data


Step3: 引用声明组件



20181212204711238.png


先import ,然后再component中定义import的组件。

上图还有个props ,可以理解为存放外部传递过来的参数的地方。

https://cn.vuejs.org/v2/api/#props


20181212205503471.png


Step4:使用v-if条件渲染控制是否显示子组件



20181212204823668.png



https://cn.vuejs.org/v2/api/#v-if


Step5: 子组件

使用template 作为根节点,承载页面

https://cn.vuejs.org/v2/api/#template


20181212210257379.png


紧接着:

20181212211401399.png


然后在created方法中初始化数据


20181212211510322.png


最后

20181212211819570.png


methods中对应自定义的方法,close方法使用$emit将关闭事件抛给父Vue.

后台返回的JSON数据如下,格式还是这个格式,下面截图的数据已经改变


20181212212834822.png

{"code":0,"msg":"success","data":{"sjsh":"审核设计","sjshHandlers":["集团钱工","集团管理员"],"csjggd":"传输竣工归档","csjggdHandlers":["集团钱工","集团管理员"],"sdsg":"省端施工","sdsgHandlers":[{"四川省":["集团管理员","上海市李工"]},{"云南省":["集团管理员","江苏省刘工"]}]}}

子组件代码

<template>
  <div class="edit-user-role common-center-popover">
    <div class="mask common-mask"></div>
    <div class="container">
      <div class="header">
        <div class="title">
          <span>环节处理人</span>
          <i @click="close" class="iconfont icon-close"></i>
        </div>
      </div>
      <div style="margin-top: 10px">
        <Table stripe :columns="columns1" :data="data1"></Table>
      </div>
      <div class="footer">
        <Button type="primary" @click="close">确定</Button>
      </div>
    </div>
  </div>
</template>
<script>
import { localAxios } from '@/utils/common/HttpUtil'
export default {
  components: {},
  props: {
    flowId: {
      type: String,
      default: ''
    }
  },
   // 初始化数据
  created () {
    localAxios.post('circuitworkflow/v1/workflow/circuit/queryCircuitAssignees/' + this.flowId)
        .then(response => {
          if (response.data.code === 0 && response.data.data) {
            this.info = response.data.data
            this.data1 = []
            // 遍历
            let obj = {}
            this.data1.push(obj)
            obj['tacheName'] = this.info.sjsh
            obj['prov'] = ''
            obj['assignee'] = this.info.sjshHandlers.toString()
            let obj1 = {}
            this.data1.push(obj1)
            obj1['tacheName'] = this.info.csjggd
            obj1['prov'] = ''
            obj1['assignee'] = this.info.csjggdHandlers.toString()
            this.info.sdsgHandlers.forEach(sdsgItem => {
              let obj2 = {}
              this.data1.push(obj2)
              obj2['tacheName'] = this.info.sdsg
              for (let pro in sdsgItem) {
                obj2['prov'] = pro
                obj2['assignee'] = sdsgItem[pro].toString()
              }
            })
          }
        })
  },
  data () {
    return {
      columns1: [
        {
          title: '环节名称',
          key: 'tacheName'
        },
        {
          title: '处理省份',
          key: 'prov'
        },
        {
          title: '处理人',
          key: 'assignee'
        }
      ],
      data1: [
        // {
        //   tacheName: '初始数据',
        //   prov: '初始数据',
        //   assignee: '初始数据'
        // }
      ]
    }
  },
  methods: {
    close () {
      this.$emit('close')
    }
  }
}
</script>
<style lang="less" scoped>
@deep: ~">>>";
.specialBtn {
  margin-left: 30px;
  background: #cadfff;
  color: #3586ff;
}
.uploadFileBtn {
  margin-left: 0;
  border-color: #2d8cf0;
}
.ivu-form-item {
  margin-bottom: 5px;
  vertical-align: top;
  zoom: 1;
}
.edit-user-role {
  z-index: 100;
  .container {
    width: 800px;
    height: 630px;
    z-index: 1;
    background: #fff;
    border-radius: 4px;
    position: relative;
    display: flex;
    flex-direction: column;
    .header {
      background: #4285f4;
      flex: 0 0 50px;
      line-height: 50px;
      border-radius: 4px 4px 0 0;
      .title {
        color: #fff;
        font-size: 14px;
        text-align: center;
        padding: 0 14px;
        & > span {
          /*float: left;*/
          font-size: 16px;
        }
        .icon-close {
          cursor: pointer;
          float: right;
          font-size: 14px;
        }
      }
    }
    .content {
      flex: 1;
      display: flex;
      .select-roles {
        display: inline-block;
        flex: 1;
        overflow: auto;
        .title {
          line-height: 40px;
          padding-left: 20px;
          font-size: 14px;
          background: rgba(241, 244, 249, 0.3);
        }
      }
      .optional-roles {
        border-right: 1px solid #ebeef5;
        .checkbox {
          margin-left: 20px;
          & @{deep} .ivu-checkbox-group-item {
            width: 113px;
            line-height: 25px;
          }
          .selected-all {
            margin: 10px 0;
          }
        }
      }
      .arrow {
        flex: 0 0 40px;
        display: flex;
        justify-content: center;
        align-items: center;
        color: RGBA(232, 232, 232, 0.6);
      }
      .selected-roles {
        border-left: 1px solid #ebeef5;
        .selected-role-item {
          width: 120px;
          line-height: 28px;
          background: rgba(241, 244, 249, 0.6);
          border-radius: 4px;
          display: inline-block;
          font-size: 12px;
          padding: 0 8px;
          margin: 5px 0 5px 13px;
          .delete-btn {
            color: #c0ccda;
            float: right;
            cursor: pointer;
            .iconfont {
              font-size: 12px;
            }
          }
        }
      }
    }
    .footer {
      position: absolute;
      top: 585px;
      flex: 0 0 45px;
      width: 100%;
      line-height: 45px;
      background: #fafafa;
      border-radius: 0 0 4px 4px;
      text-align: center;
      .buttons {
        float: right;
        margin-right: 15px;
        button {
          width: 90px;
        }
      }
    }
  }
}
.common-center-popover {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
  display: flex;
  justify-content: center;
  align-items: center;
  .common-mask {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: #ccc;
    opacity: 0.4;
  }
  .ivu-tabs {
    color: #1f2d3d;
  }
  .span1 {
    display: inline-block;
    overflow: hidden;
    height: 32px;
    line-height: 32px;
  }
  .span2 {
    display: inline-block;
    overflow: hidden;
    height: 32px;
    line-height: 32px;
  }
}
</style>


相关文章
|
26天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
128 64
|
26天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
30 8
|
26天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
1月前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
1月前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
1月前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
63 1
|
1月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释