react.js CMS 刪除功能的實現

頁面效果圖:react

 

數據操做分析:bootstrap

  1. 在查詢表組件的  TableData.js 中操做以下內容:
    1. 給每一行綁定一個checkbox,且在點擊這個 checkbox 時,觸發 action 中的一個方法(formatPostCollectionList),這個方法是用來更新選中的實體數組。formatPostCollectionList爲action中的方法,須要export
      1. 定義每一行的實體爲一個數組,用變量 postCollections 表示
      2. 若是選中當前行,則更新實體數組中的數據;若是取消當前行,則刪除實體中的數據;
      3. 參數爲  row  ;
    2. 點擊刪除按鈕後,使用 componentDitUpdate() 生命週期方法,在組件更新後調用。
      1. 若是刪除成功,則執行 action 中的方法 clearPostCollection()。這個方法是用來清空當前行實體中的數據;
      2. 若是刪除成功,最後執行  查詢表的刷新從新加載數據的方法
  2. 更新實體數據與清空實體數據的方法,在 action 中執行。

 

代碼分析:api

 

  1. 表查詢操做
    1. 調查詢接口,Api中的方法
      1. searchPostCollectionByActivityId(activityId, callback) { const queryParam = `/tob/post/search?activeId=${activityId}`;   //接口,使用``能夠在URL中顯示查詢參數
         Config.get(queryParam, callback); }

         

    2. action中操做查詢數據的方法  postCollectionEntityList 存放接口中的全部數據
      1. export function initPostCollection(row){ return (dispatch, getState) => { let activityId = row.activityId; Api.searchPostCollectionByActivityId(activityId, params => { dispatch(initPostCollectionSetter(activityId,params)); }); } } function initPostCollectionSetter(activityId,params){ return { type:INIT_POST_COLLECTION, activityId:activityId, data:{postCollectionEntityList:params} } }

         

    3. 3. TatleData 表組件中調用 action 的方法,至此 表數據 OK
      1. export default class TableData extends Component { constructor(props){ super(props); } componentDidMount() { const param = this.props.queryData; console.log("param === " + param); this.props.initPostCollection(param);//action中獲取接口數據的方法 }
        render(){    // 定義postCollectionEntityList中的數據 let postCollectionEntityList
        = [ { postCollectionName:'', postCollectionId:'', activityId:'' } ]; //判斷,若是postCollectionEntityList中有數據,則把數據顯示出來 if (this.props.postCollectionState.postCollectionEntityList) { postCollectionEntityList = this.props.postCollectionState.postCollectionEntityList; console.log("postCollectionEntityList" + postCollectionEntityList); } //acb 表數據 return( <div><TableExit data={postCollectionEntityList} acb={this.props.initPostCollection}> <TableCloumnsExit dataField="activityTitle">活動名稱</TableCloumnsExit> <TableCloumnsExit dataField="postCollectionName">帖子集名稱</TableCloumnsExit> <TableCloumnsExit dataField="postCollectionId">帖子集編號</TableCloumnsExit> <TableCloumnsExit dataField="active" dataFormat={this.postCollectionFormatter}>修改</TableCloumnsExit> <TableCloumnsExit dataField="send" dataFormat={this.activeFormatter.bind(this)}>發送</TableCloumnsExit> <TableCloumnsExit dataField="send" dataFormat={this.questionBankFormatter.bind(this)}>題庫</TableCloumnsExit> </TableExit> </div> ); } }

         

  2. 刪除表數據操做
    1. 調刪除接口,API中的方法
      1. deletePostCollections (activityId ,params, callback) { let path = `/tob/post/deletePostCollection/${activityId}`; //刪除接口 Config.deleteWithNoResponse(path ,params, callback); }

         

    2. action 中寫刪除數據的方法
      1. 刪除實體
        1. 刪除實體前要先 插入 checkbox
          1.  checkboxFormatter(cell,row) { return <input bsStyle="primary" type="checkbox"></input>
                }

             

        2. 查詢表中使用 checkbox
          1. <TableCloumnsExit dataField="alter" dataFormat={this.checkboxFormatter.bind(this)}>選擇</TableCloumnsExit>
        3. 點擊 checkbox 會觸發 更新選中的實體數據的方法
          1. checkboxFormatter(cell,row) { return <input bsStyle="primary" type="checkbox" onClick={this.props.formatPostCollectionList.bind(this,row)}></input>
                }
        4. 更新選中實體數據的方法,在action中編寫
          1. export function formatPostCollectionList(row) { return(dispatch, getState) => { let postCollectionId = row.postCollectionId; //獲取每一行的ID let state = getState().postCollectionState; //從postCollectionState()中拿到state並賦值給全局state let postCollections = state.postCollections; // 紅色字體標註爲實體中的數據容器 let postCollectionItem = { postCollectionId:postCollectionId //實體中的數據ID }; if (postCollections) { //postCollections 實體數據,可能 有數據 let index = -1; // index = -1 指默認實體中沒有數據 for (let i = 0 ;i < postCollections.length ;i++) { //若是實體中有數據,則循環 let postCollection = postCollections[i]; //拿實體中的數據,給變量postCollection let id = postCollection.postCollectionId; //從拿到的實體數據中,取每個ID,方法對比(選中的數據與實體中的數據對比) if (postCollectionId == id) { //若是實體中的ID == 選中的ID index = i; //把實體中選中的的數據 賦值爲 i } } if (index > -1) { //若是實體的數據存在,不爲空 postCollections.splice(index,1); //刪除實體對象中index位置中的一個數據 } else { postCollections.push(postCollectionItem); //若是實體數據爲空,則push實體中的ID數據 } } else { postCollections = []; // 第一次render時,實體數據可能爲空 / 爲undefined,那麼將它定義爲一個數組 postCollections.push(postCollectionItem); //給這個空數組push數據 } dispatch(formatPostCollectionListSetter(postCollections)); } } function formatPostCollectionListSetter(params){ return { type:SET_POST_COLLECTIONS, data:{postCollections:params} //紅色變量爲實體數據 } }

             

        5. 選中實體數據後,點擊刪除按鈕,會觸發deletePostCollections  刪除方法
        6. export const DELETE_POST_COLLECTIONS = 'DELETE_POST_COLLECTIONS'; export function deletePostCollections(){ //點擊刪除按鈕後,觸發deletePostCollections刪除方法 return(dispatch, getState) => { let state = getState().postCollectionState; let activityId = state.activityId; let postCollections = state.postCollections; //實體對象從state中獲取 Api.deletePostCollections(activityId ,postCollections, params => { //調刪除接口的方法 dispatch(deletePostCollectionsSetter(params)); }); } } function deletePostCollectionsSetter(params){ alertPre("",params); return { type:DELETE_POST_COLLECTIONS, data:{deletePostCollectionsResponse:params} //deletePostCollectionsResponse 選中的要刪除的數據容器 } }

          6. 把刪除數據的方法綁定到刪除按鈕,綁定前根據刪除鈕鈕的狀態,判斷是否可點擊數組

        7. render(){ let dis = true; //刪除按鈕狀態,默認爲禁用狀態,返回爲true let postCollections = this.props.postCollectionState.postCollections; //獲取實體中的數據 if (typeof(postCollections) == 'undefined' || postCollections.length == 0) { //若是實體中的數據爲 undefined 或者 爲空 dis = true; //若是實體中沒有數據,則按鈕狀態爲禁用狀態 } else { dis = false; //若是實體中有數據,選中後的狀態爲可點擊狀態 } const buttonsInstanceDel = ( <ButtonToolbar className="mb10">
                          <Button bsStyle="danger" disabled={dis} onClick={this.props.deletePostCollections}>刪除貼子集</Button>  //紅色字體標爲 刪除數據的方法
                      </ButtonToolbar>
           ); return( <div> {buttonsInstanceDel} </div>
           ) }

          7.  刪除成功後,調用生命週期的方法,在 表查詢組件中,更新表數據。若是刪除成功,則執行兩個方法:清空實體數據與刷新加載數據session

        8. componentDidUpdate () { let deletePostCollectionsResponse = this.props.postCollectionState.deletePostCollectionsResponse; //deletePostCollectionsResponse 刪除的數據 if (typeof(deletePostCollectionsResponse) != 'undefined') { //若是這個數據類型不是 undefined let status = deletePostCollectionsResponse.status; //獲取到這個刪除的數據狀態 if (200 == status) { //若是爲200,刪除成功 this.props.clearPostCollection(); //加載清空實體數據的方法 clearPostCollection,就是從實體數據中刪除被刪除的數據 let param = { activityId:this.props.postCollectionState.activityId } this.props.initPostCollection(param); //根據ID從新加載剩餘的數據 } } }
      2. 清空實體
        1. export const CLEAR_POST_COLLECTION = 'CLEAR_POST_COLLECTION'; export function clearPostCollection(){ return { type: CLEAR_POST_COLLECTION, data:{ //實體中的數據名稱
           addPostCollectionResponse:{}, postCollections:[], deletePostCollectionsResponse:{}, postCollectionName:'', postNumber:'0', postFieldList:[] } } }

           

  3. 全部代碼結構,含一個api,一個action,兩個component,一個reducers
  • api(查詢 / 刪除)
//查詢
searchPostCollectionByActivityId(activityId, callback) { const queryParam = `/tob/post/search?activeId=${activityId}`;
 Config.get(queryParam, callback); } //刪除
deletePostCollections (activityId ,params, callback) { let path = `/tob/post/deletePostCollection/${activityId}`; Config.deleteWithNoResponse(path ,params, callback); }

 

  • action(查詢方法 / 更新選中實體數據方法 / 刪除方法 / 清空實體數據方法 )
//查詢表數據
export function initPostCollection(row){ return (dispatch, getState) => { let activityId = row.activityId; Api.searchPostCollectionByActivityId(activityId, params => { dispatch(initPostCollectionSetter(activityId,params)); }); } } function initPostCollectionSetter(activityId,params){ return { type:INIT_POST_COLLECTION, activityId:activityId, data:{postCollectionEntityList:params} } } //更新選中實體數據
export function formatPostCollectionList(row) { return(dispatch, getState) => { let postCollectionId = row.postCollectionId; let state = getState().postCollectionState; let postCollections = state.postCollections; let postCollectionItem = { postCollectionId:postCollectionId }; if (postCollections) { let index = -1; for (let i = 0 ;i < postCollections.length ;i++) { let postCollection = postCollections[i]; let id = postCollection.postCollectionId; if (postCollectionId == id) { index = i; } } if (index > -1) { postCollections.splice(index,1); } else { postCollections.push(postCollectionItem); } } else { postCollections = []; postCollections.push(postCollectionItem); } dispatch(formatPostCollectionListSetter(postCollections)); } } function formatPostCollectionListSetter(params){ return { type:SET_POST_COLLECTIONS, data:{postCollections:params} } } //刪除方法
export const DELETE_POST_COLLECTIONS = 'DELETE_POST_COLLECTIONS'; export function deletePostCollections(){ return(dispatch, getState) => { let state = getState().postCollectionState; let activityId = state.activityId; let postCollections = state.postCollections; Api.deletePostCollections(activityId ,postCollections, params => { dispatch(deletePostCollectionsSetter(params)); }); } } function deletePostCollectionsSetter(params){ alertPre("",params); return { type:DELETE_POST_COLLECTIONS, data:{deletePostCollectionsResponse:params} } } //清空實體數據
export const CLEAR_POST_COLLECTION = 'CLEAR_POST_COLLECTION'; export function clearPostCollection(){ return { type: CLEAR_POST_COLLECTION, data:{ addPostCollectionResponse:{}, postCollections:[], deletePostCollectionsResponse:{}, postCollectionName:'', postNumber:'0', postFieldList:[] } } }

 

  • component(BtnDelData.js / TableData.js (checkbox))
//刪除按鈕組件
import React,{Component} from 'react'; import {render} from 'react-dom'; import ReactBootstrap , {ButtonToolbar,Button,Pagination} from 'react-bootstrap'; export default class BtnDelData extends Component { constructor(props){ super(props); } render(){ let dis = true; let postCollections = this.props.postCollectionState.postCollections; if (typeof(postCollections) == 'undefined' || postCollections.length == 0) { dis = true; } else { dis = false; } const buttonsInstanceDel = ( <ButtonToolbar className="mb10">
                <Button bsStyle="danger" disabled={dis} onClick={this.props.deletePostCollections}>刪除貼子集</Button>
            </ButtonToolbar>
 ); return( <div> {buttonsInstanceDel} </div>
 ) } } //表組件
import React, {Component} from 'react'; import {render} from 'react-dom'; import ReactBootstrap , {ButtonToolbar,Button,Pagination,Grid,Row,Col} from 'react-bootstrap'; import { Router, Route, IndexRoute, Link, IndexLink, browserHistory } from 'react-router'; const ACTIVE = { color: 'red' }; import {sessionSetItem,sessionGetItem} from 'storage'; import BtnAddData from './BtnAddData.js'; import BtnDelData from './BtnDelData.js'; //引用公共組件
import TableExit from 'public_component/table/TableExit.js'; import TableCloumnsExit from 'public_component/table/TableCloumnsExit.js'; //跳轉路徑
import {invitation_main_path,post_collection_main_path,activity_main_path,question_bank_main_path} from '/build/config.js'; export default class TableData extends Component { constructor(props){ super(props); } componentDidMount() { const param = this.props.queryData; console.log("param === " + param); this.props.initPostCollection(param); } componentDidUpdate () { let deletePostCollectionsResponse = this.props.postCollectionState.deletePostCollectionsResponse; if (typeof(deletePostCollectionsResponse) != 'undefined') { let status = deletePostCollectionsResponse.status; if (200 == status) { this.props.clearPostCollection(); let param = { activityId:this.props.postCollectionState.activityId } this.props.initPostCollection(param); } } } //修改
 activeFormatter(cell,row) { return <Button bsStyle="primary" onClick={this.props.sendPostCollection.bind(null,row)}>推送</Button>
 } checkboxFormatter(cell,row) { return <input bsStyle="primary" type="checkbox" onClick={this.props.formatPostCollectionList.bind(this,row)}></input>
 } //修改
 postCollectionFormatter(cell,row) { return <Link to={{ pathname:post_collection_main_path, query: row}} activeStyle={ACTIVE}>修改</Link>
 } questionBankFormatter(cell,row) { return <Link to={{ pathname: question_bank_main_path, query: row}} activeStyle={ACTIVE} >查看題庫</Link>
 } render(){ let postCollectionEntityList = [ { postCollectionName:'', postCollectionId:'', activityId:'' } ]; if (this.props.postCollectionState.postCollectionEntityList) { postCollectionEntityList = this.props.postCollectionState.postCollectionEntityList; console.log("postCollectionEntityList" + postCollectionEntityList); } //let postCollectionEntityList = this.props.postCollectionState.postCollectionEntityList;

        //添加與刪除
        const gridInstance = ( <Grid className="mb5">
                <Row className="show-grid">
                    <Col sm={1} mdPush={-7}><BtnAddData {...this.props} activityParam={this.props.queryData} /></Col>
                    <Col sm={1}><BtnDelData {...this.props} /></Col>
                </Row>
            </Grid>
 ); //acb 表數據
        return( <div> {gridInstance} <TableExit data={postCollectionEntityList} acb={this.props.initPostCollection}>
                    <TableCloumnsExit dataField="alter" dataFormat={this.checkboxFormatter.bind(this)}>選擇</TableCloumnsExit>
                    <TableCloumnsExit dataField="activityTitle">活動名稱</TableCloumnsExit>
                    <TableCloumnsExit dataField="postCollectionName">帖子集名稱</TableCloumnsExit>
                    <TableCloumnsExit dataField="postCollectionId">帖子集編號</TableCloumnsExit>
                    <TableCloumnsExit dataField="active" dataFormat={this.postCollectionFormatter}>修改</TableCloumnsExit>
                    <TableCloumnsExit dataField="send" dataFormat={this.activeFormatter.bind(this)}>發送</TableCloumnsExit>
                    <TableCloumnsExit dataField="send" dataFormat={this.questionBankFormatter.bind(this)}>題庫</TableCloumnsExit>
                </TableExit>
                <ButtonToolbar>
                    <Link className="btn btn-primary" to={{ pathname:activity_main_path}}>返回到活動界面</Link>
                </ButtonToolbar>
            </div>
 ); } }

 

  • reducers (state合併)

 

以上爲刪除功能的用法。react-router

相關文章
相關標籤/搜索