某赞管理系统的构造过程(三)

12 点击跳转权益卡(重难点)

编程式跳转
当有父组件 子组件 孙子组件时,从子组件跳转到孙子组件 不能获取到数据
需要在父组件定义点击事件 传给子组件 在点击跳转到孙子组件

this.props没有东西 为空
父组件绑定事件 子组件使用
this.props.onSkip()才有东西
<!--在父组件  -->
 skipToCardCreate(){
     console.log('2222',this.props)
     <!-- 从此处获得数据,路由跳转到create页面-->
     this.props.history.push('/card/create')
 
   }
 <TabCardList onSkip={this.skipToCardCreate.bind(this)}></TabCardList>
 <!-- 子组件-->
 skipToCardCreate(){
     <!-- -->
     console.log('11111',this.props)
     <!-- 从父组件继承事件-->
     this.props.onSkip()
   }
  <Button type="primary" onClick={this.skipToCardCreate.bind(this)}>

此时路由也需要改变

{
    <!-- 一级路由 没有跳转 父组件 -->
    id: 1,
    path: null,
    text: '客户管理',
    component: null,
    icon:'apple',
    sub:[
          {
            id: 101,
            path:'/home',
            text: '客户首页',
            component:Home
          },
          <!-- 二级路由 子组件-->
          {
           id:102,
           path:'/card',
           text:'权益卡',
           component:Card,
           <!-- 三极路由 孙子组件-->
           children:[
             {
              id:10201,
              path:'/card/create',
              text:'新建权益卡',
              component:CardCreate,
             }
           ]
          }
    ]
  }

生成route容器如下文所示

// 生成Route容器
  createRoute(arr) {
    let routeArr = []
    // 爷爷
    arr.map((ele, idx) => {
      if (ele.sub && ele.sub.length > 0) {
        // 爸爸
        ele.sub.map((ele2, idx2)=>{
          routeArr.push(
            <Route key={ele2.id} path={ele2.path} exact component={ele2.component}></Route>
          )
          if(ele2.children&&ele2.children.length>0){
            //  孙子
            ele2.children.map((ele3,idx3)=>{
              routeArr.push(
                <Route key={ele3.id} path={ele3.path} exact component={ele3.component}></Route>
              )
            })
          }
        })
      }
    })
    return routeArr
  }

13调接口遇到的问题

   创建store文件,其中可以把文件集成到一个大的store文件当中
import CardStore from './card'
<!-- 需要哪个组件 导入哪个组件 集成之后抛出 -->
class Store{
    constructor(){
        this.CardStore=new CardStore()
    }
}
const store=new Store()
export default store

在每个独立的store当中做操作
新建页面card.js

import {observable,action} from 'mobx'
import { getCardList } from '../utils/api';
class CardStore{
    @observable list=[] //放置所有数据
    @action getCardList(){
        getCardList({page:1,size:2},res=>{
            this.list=[...this.list3,...res.data.data]
            // console.log(this.list)
            this.list1=[...this.list3,...res.data.data]
             // 初始化
        this.updateList2(1)
        })
    }
}
export default CardStore
 在通过 @inject('store') @observer注入到tabcardlist里面
 1.调接口进行页面渲染时 
  componentDidMount(){
      this.props.store.CardStore.getCardList()
  }
   没有出来页面报错解决办法:
                 1.看看list有没有赋值
                 2.数据格式有没有问题 进行打印可以看到

14. 数据字典

table表格里面的render渲染函数(数据字典)当数据显示为数字没有变成字符串时 要使用数据字典渲染
{
          // width:80,
        title: '领取条件',
        dataIndex: 'condition',
        key: 'condition',
        <!-- 函数 -->
        render:(text,row,index)=>{
          let zh=''
          switch(row.condition){
            case 1:
                zh='可直接领取'
                break;
            case 2:
                zh='需付费购买'
                break;
            case 3:
                zh='满足指控条件'
                break;
                default:
          }
          return (
            <span>{zh}</span>
          )
        }

15.分页

    pagesize  total page三个数据缺一不可
    在相关页面中定义一个事件 
    let {list1,list2} =this.props.store.CardStore
    <!-- 从里面取出list -->
pageChange(e){
    console.log(e.current)
    this.props.store.CardStore.getCardOfPage(e.current) //current把页码穿过去

  }
  <!-- 在表格当中-->
  {/* 表格 */}
        <div>
          <Table 
             onChange={this.pageChange.bind(this)}
              rowKey='id'
              columns={columns} 
              <!-- 页面数局需list2来渲染-->
              <!-- pagesize可调 total字段是表格自带属性 需要用到list1-->
              dataSource={list2} 
              scroll={{ x: 1000 }}
              pagination={{pageSize:2,total:list1.length}}
              />
        </div>

在store当中

import {observable,action} from 'mobx'
import { getCardList } from '../utils/api';
class CardStore{
    @observable list=[] //放置所有数据
    @observable list1=[] //用于各种增删改查的逻辑
    @observable list2=[] //用于页面显示
    @observable list3=[] //用于缓存新增的权益卡
    <!-- 调接口-->
    @action getCardList(){
        getCardList({page:1,size:2},res=>{
            this.list=res
            // console.log(this.list)
            this.list1=res
             // 初始化 调接口成功时默认调取第一页的接口
        this.updateList2(1)
        })
    }
    // 分页 用于对数组进行切割
    @action updateList2(page){
        this.list2=this.list1.slice((page-1)*2,page*2)
    }
    // 分页查询 当通过某一项进行查询时 也要进行分割
    @action getCardOfPage(payload){
        <!-- payload相当于page -->
        this.updateList2(payload)
    }

}
export default CardStore

15.表单筛选

受控表单要加一个value
在input事件里面用onChange事件

<!-- store里面 -->
 @action getCardOfStatus(payload){
        const status=payload //数据类型是字符串
        // 过滤方法 通过对list过滤 选出符合条件的返回去
        const res=this.list.filter(ele=>{
            return ele.status===status
        })
        this.list1=res
        // 筛选完后的页面进行分页
        this.updateList2(1)
    }

在相关表单中
activeKey

statusChange(e){
    console.log(e)
    this.props.store.CardStore.getCardOfStatus(e)
    this.setState(
      {
        tabKey:e
      }
      
    )
  }
  
<!-- activeKey={this.state.tabKey} 是表单的方法 页面点击筛选时 有时候不能返回到最开始的页面 使用activeKey -->
<Tabs type="card" activeKey={this.state.tabKey} onChange={this.statusChange.bind(this)}>
            <TabPane tab="使用中" key="1">
            </TabPane>
            <TabPane tab="已禁用" key="2">
            </TabPane>
            <TabPane tab="已过期" key="3">
            </TabPane>
     </Tabs>

16 关键字筛选

   store当中的写法
    // 根据关键字进行筛选
    @action getCardListOfSearch(payload){
        const searchText=payload.trim()
        let res=this.list.filter(ele=>{
            return ele.name.indexOf(searchText)!==-1
        })
        this.list1=res
        this.updateList2(1)
    }

17.创建权益卡

<!-- 在cardCreat中 -->
// 获取卡名字
  nameChange(e){
    //  console.log(e.target.value)
     this.setState({
       name:e.target.value
     })
  }
在提交时间当中使用name

18.对时间区域的获取方法(RangePicker)

禁用时间属性:eg:disabled={period!==3}
安装moment
默认时间属性:defaultValue={[moment('2019-11-20'),moment('2010-12-19')]}

// 获取时间区域
  timeChange(e){
      
  //  console.log(e[0].format('YYYY-MM-DD')) 2019-11-11
  //  console.log(e[1].format('YYYY-MM-DD'))  2019-11-12
    if(e&&e.length===2){当选中的状态是时间区域的时候
      this.setState({
                     用~拼接两个数据 format方法
      periodTime:e[0].format('YYYY-MM-DD')+'~'+e[1].format('YYYY-MM-DD')
    })
    }
   
  }

19.多选框的获取方法

  // 获取权益
  rightChange(e){
    // console.log(e.target.value,e.target.checked)
    let arr=this.state.right
    if(e.target.checked){
      arr.push(e.target.value)
    }else{
      let idx=arr.findIndex(ele=>ele===e.target.value)
      arr.splice(idx,1)
    }
    // new set 是对象 通过点变成数组
    this.setState({right:[...new Set(arr)]})
  }
  
 选取到默认的checked
  const options1 = [
        { label: '包邮', value: '1' },
        { label: '消费折扣', value: '2' },
        { label: '积分回馈倍率', value: '3' },
        { label: '获得好友体验卡', value: '4' }
      ];
      options1.map((ele,idx)=>{
        let idx2=right.findIndex(ele2=>ele2===ele.value)
        if(idx2!==-1){
          options1[idx].checked=true
        }else{
          options1[idx].checked=false
        }
        return false
      })
定义到事件
<Checkbox 
                       value={ele.value}
                          onChange={this.rightChange.bind(this)}
                         checked={ele.checked}>{ele.label}</Checkbox>

20.数据改变成中文显示

// 处理权益数据的中文显示
    list2.map((ele,idx)=>{
      let str=''
      ele.right.map((ele2,idx2)=>{
        switch(ele2){
          case 1:
            str+='包邮'
            break;
          case 2:
            str+='消费折扣'
            break;
          case 3:
            str+='积分回馈率'
            break;
          case 4:
            str+='获取好友体验卡'
            break;
          default:
        }
        return false
      })
      list2[idx].right_zh=str
      return false
    })
数组里面:
    { 
            title: '权益', 
            dataIndex: 'right_zh', 
             key: 'right_zh',
          }

21.数据提交方法

提交方法到store中

submit(){
// 获取提交的值
// 获取改变后的值
            const period=this.state.period
            const data={
              name:this.state.name,
              period:period===3?this.state.periodTime:period,
              condition:this.state.condition,
              right:this.state.right
            }
            console.log('------',data)
            // 数据类型校验
            // 数据提交
            this.props.store.CardStore.add(data)
            console.log('入参',data)
            // 提交成功 跳转首页
            this.props.history.replace('/card')
  }
  <!-- store中的方法-->
   // 提交
      @action add(payload){
          const card=payload
          插入到数据中需要一个独立的id 
          card.id=Date.now()
          card.status=1
          console.log('===============',card)
          <!-- 放在第一条-->
          this.list3.unshift(card)
          console.log(this.list3)
      }

21.数据提交方法

提交方法到store中

submit(){
// 获取提交的值
// 获取改变后的值
            const period=this.state.period
            const data={
              name:this.state.name,
              period:period===3?this.state.periodTime:period,
              condition:this.state.condition,
              right:this.state.right
            }
            console.log('------',data)
            // 数据类型校验
            // 数据提交
            this.props.store.CardStore.add(data)
            console.log('入参',data)
            // 提交成功 跳转首页
            this.props.history.replace('/card')
  }
  <!-- store中的方法-->
   // 提交
      @action add(payload){
          const card=payload
          插入到数据中需要一个独立的id 
          card.id=Date.now()
          card.status=1
          console.log('===============',card)
          <!-- 放在第一条-->
          this.list3.unshift(card)
          console.log(this.list3)
      }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容