js 面向对象 字典的威力

214 阅读2分钟

现在要做一个 点击查看详情 然后弹窗展示信息的需求 弹窗分为上下两部分 上面部分展示小程序的信息 下面部分展示APP(H5)的信息 但是没有那么简单 如果是单独展示 那就非常简单 现在是 上下两个区域 都要根据一个唯一的字段 然后分别渲染4种情况的字段上去 所以要用上字典 类似模板这种东西

// 查看详情弹框 showDetail(id, data, title) { let yss = data[0] || {}; let app = data[1] || {}; let yssProps = yss.props || {}; let appProps = app.props || {}; let yssNavigationConfig = yssProps.navigationConfig || {}; let appNavigationConfig = appProps.navigationConfig || {};

  let getTmp = (type, pageType) => {
    let main, config;
    if(type == 'app') {
      main = app
      config = appNavigationConfig
    }else if( type == 'yss') {
      main = yss
      config = yssNavigationConfig
    }
    //这个就是字典 模板 根据一个唯一的字段 去渲染不同的数据
    let tmp = {
      '0': {
        // 自研小程序
        head: [
          { title: '节点ID', dataIndex: 'name', key: 'name', width: 160 },
          { title: main.node_id, dataIndex: 'value', key: 'value' },
        ],
        body: [
          { name: '节点路径', value: main.abs_path, width: 160 },
          { name: '页面类型', value: this.pageTypes[config.page_type] },
          { name: 'url', value: config.url },
          { name: '是否需要登录', value: this.need_login[config.need_login] },
          { name: '服务准入证件类型', value: this.id_types[config.id_types] },
        ],
      },
      '1': {
        // 自研h5
        head: [
          { title: '节点ID', dataIndex: 'name', key: 'name', width: 160 },
          { title: main.node_id, dataIndex: 'value', key: 'value' },
        ],
        body: [
          { name: '节点路径', value: main.abs_path, width: 160 },
          { name: '页面类型', value: this.pageTypes[config.page_type] },
          { name: 'H5源链接', value: config.url },
          { name: '是否需要登录', value: this.need_login[config.need_login] },
          { name: '服务准入证件类型', value: this.id_types[config.id_types] },
        ],
      },
      '2': {
        // 第三方小程序
        head: [
          { title: '节点ID', dataIndex: 'name', key: 'name', width: 160 },
          { title: main.node_id, dataIndex: 'value', key: 'value' },
        ],
        body: [
          { name: '节点路径', value: main.abs_path, width: 160 },
          { name: '页面类型', value: this.pageTypes[config.page_type] },
          { name: 'url', value: config.url },
          { name: 'appid', value: config.appId },
          { name: '是否需要登录', value: this.need_login[config.need_login] },
          { name: '服务准入证件类型', value: config.id_types?config.id_types.map(item => {
            return this.id_types[item]
          }).join(' 、') : ''},
          { name: '是否经过授权页', value: config.need_auth === '0' ? '否' : '是' },
          { name: '是否需要token', value: config.needToken === '0' ? '否' : '是' },
          { name: '组织机构(orgid)', value: config.orgid },
          { name: '业务部门(bussiness)', value: config.business },
        ],
      },
      '3': {
        // 第三方h5
        head: [
          { title: '节点ID', dataIndex: 'name', key: 'name', width: 160 },
          { title: main.node_id, dataIndex: 'value', key: 'value' },
        ],
        body: [
          { name: '节点路径', value: main.abs_path, width: 160 },
          { name: '页面类型', value: this.pageTypes[config.page_type] },
          { name: 'H5源链接', value: config.url },
          { name: '是否需要登录', value: this.need_login[config.need_login] },
          { name: '服务准入证件类型', value: config.id_types?config.id_types.map(item => {
            return this.id_types[item]
          }).join(' 、') : '' },
          { name: '是否经过授权页', value: config.need_auth === '0' ? '否' : '是' },
          { name: '是否需要token', value: config.needToken === '0' ? '否' : '是' },
          { name: '组织机构(orgid)', value: config.orgid },
          { name: '业务部门(bussiness)', value: config.business },
        ],
      },
    };

    return tmp[pageType]
  }
  
  let self = this;
  const h = this.$createElement;
  let tableBody = [];
  if(!yssNavigationConfig.page_type) {
    tableBody.push(
      h('gmd-table', {
        scopedSlots: { title: props => h('span', '小程序') },
        props: {
          bordered: true,
          pagination: false,
          'row-key': 'name',
          columns: [],
          'data-source': [],
        },
      }),
    );
  }
  if (yssNavigationConfig.page_type) {
    tableBody.push(
      h('gmd-table', {
        scopedSlots: { title: props => h('span', '小程序') },
        props: {
          bordered: true,
          pagination: false,
          'row-key': 'name',
          columns: getTmp('yss', yssNavigationConfig.page_type).head,
          'data-source': getTmp('yss', yssNavigationConfig.page_type).body,
        },
      }),
    );
  }
   if(!appNavigationConfig.page_type) {
    tableBody.push(
      h('gmd-table', {
        scopedSlots: { title: props => h('span', 'APP') },
        props: {
          bordered: true,
          pagination: false,
          'row-key': 'name',
          columns: [],
          'data-source': [],
        },
      }),
    );
  }
  // console.log(appNavigationConfig.page_type, tmp[appNavigationConfig.page_type],99999999888)
  if (appNavigationConfig.page_type) {
    tableBody.push(
      h('gmd-table', {
        scopedSlots: { title: props => h('span', 'APP') },
        props: {
          bordered: true,
          pagination: false,
          'row-key': 'name',
          columns: getTmp('app', appNavigationConfig.page_type).head,
          'data-source': getTmp('app', appNavigationConfig.page_type).body,
        },
      }),
    );
  }

  modal({
    title: `${id}-${title}`,
    content: Vue.component('delete', {
      render: h => {
        return h(
          'div',
          {
            style: {
              height: '500px',
              overflow: 'scroll',
            },
          },
          tableBody,
        );
      },
    }),
    pdata: {},
    okText: '确认',

    showFoot: true,
    success: () => {},
  });
},
// 点击查看详情按钮
handleDetail(data) {
  console.log(1111111111111111111111111)
  console.log(data,55555)
  let title = data.item_name;
  let item_id = +data.item_id;
  let item_type = data.online_platform.slice(0,1) === "," ? data.online_platform.slice(1) : data.online_platform;
  console.log(item_type,6666)
  //获取查看详情弹窗的数据
  joinneed_detail({
    item_id,
    item_type,
  }).then(res => {
  //传数据给查看详情弹窗
    this.showDetail(data.item_id, res.data.result, title);
  });
},