react.js CMS 删除功能的实现方法

页面效果图:

数据操作分析:

在查询表组件的  TableData.js 中操作如下内容:

给每一行绑定一个checkbox,且在点击这个 checkbox 时,触发 action 中的一个方法(formatPostCollectionList),这个方法是用来更新选中的实体数组。formatPostCollectionList为action中的方法,需要export

定义每一行的实体为一个数组,用变量 postCollections 表示

如果选中当前行,则更新实体数组中的数据;如果取消当前行,则删除实体中的数据;

参数为  row  ;

点击删除按钮后,使用 componentDitUpdate() 生命周期方法,在组件更新后调用。

如果删除成功,则执行 action 中的方法 clearPostCollection()。这个方法是用来清空当前行实体中的数据;

如果删除成功,最后执行  查询表的刷新重新加载数据的方法

更新实体数据与清空实体数据的方法,在 action 中执行。

代码分析:

表查询操作

1、调查询接口,Api中的方法

searchPostCollectionByActivityId(activityId, callback) {
    const queryParam = `/tob/post/search?activeId=${activityId}`;  //接口,使用``可以在URL中显示查询参数
    Config.get(queryParam, callback);
  }

2、action中操作查询数据的方法  postCollectionEntityList 存放接口中的所有数据

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、TatleData 表组件中调用 action 的方法,至此 表数据 OK

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>
    );
  }
}

删除表数据操作

调删除接口,API中的方法

deletePostCollections (activityId ,params, callback) {
    let path = `/tob/post/deletePostCollection/${activityId}`; //删除接口
    Config.deleteWithNoResponse(path ,params, callback);
  }

action 中写删除数据的方法

删除实体

删除实体前要先 插入 checkbox

checkboxFormatter(cell,row) {
    return <input bsStyle="primary" type="checkbox"></input>
  }

查询表中使用 checkbox

<TableCloumnsExit dataField="alter" dataFormat={this.checkboxFormatter.bind(this)}>选择</TableCloumnsExit>

点击 checkbox 会触发 更新选中的实体数据的方法

checkboxFormatter(cell,row) {
    return <input bsStyle="primary" type="checkbox" onClick={this.props.formatPostCollectionList.bind(this,row)}></input>
  }

更新选中实体数据的方法,在action中编写

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} //红色变量为实体数据
  }
}

选中实体数据后,点击删除按钮,会触发deletePostCollections  删除方法

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 选中的要删除的数据容器
  }
}

把删除数据的方法绑定到删除按钮,绑定前根据删除钮钮的状态,判断是否可点击

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>
    )
  }

删除成功后,调用生命周期的方法,在 表查询组件中,更新表数据。如果删除成功,则执行两个方法:清空实体数据与刷新加载数据

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重新加载剩余的数据
      }
    }
  }

清空实体

export const CLEAR_POST_COLLECTION = 'CLEAR_POST_COLLECTION';
export function clearPostCollection(){
  return {
    type: CLEAR_POST_COLLECTION,
    data:{  //实体中的数据名称
      addPostCollectionResponse:{},
      postCollections:[],
      deletePostCollectionsResponse:{},
      postCollectionName:'',
      postNumber:'0',
      postFieldList:[]
    }
  }
}

所有代码结构,含一个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.js CMS 删除功能的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • react.js CMS 删除功能的实现方法

    页面效果图: 数据操作分析: 在查询表组件的  TableData.js 中操作如下内容: 给每一行绑定一个checkbox,且在点击这个 checkbox 时,触发 action 中的一个方法(formatPostCollectionList),这个方法是用来更新选中的实体数组.formatPostCollectionList为action中的方法,需要export 定义每一行的实体为一个数组,用变量 postCollections 表示 如果选中当前行,则更新实体数组中的数据:如果取消当前行

  • React.js绑定this的5种方法(小结)

    this在javascript中已经相当灵活,把它放到React中给我们的选择就更加困惑了.下面一起来看看React this的5种绑定方法. 1.使用React.createClass 如果你使用的是React 15及以下的版本,你可能使用过React.createClass函数来创建一个组件.你在里面创建的所有函数的this将会自动绑定到组件上. const App = React.createClass({ handleClick() { console.log('this > ', th

  • Android通讯录开发之删除功能的实现方法

    无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况.在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通

  • React鼠标多选功能的配置方法

    一般列表都有选择功能,单选复选多选都很常见.在自定义循环的列表,图像中,实现鼠标单选,多选,反选功能. # React mousemultiples # React 鼠标多选组件 React 鼠标多选组件 局限性 > 主要实现鼠标多选的效果, 在不破坏原有的列表情况下,嵌入组件拥有鼠标多选功能. npm包地址 [链接](https://www.npmjs.com/package/mousemultiples) 安装 npm i mousemultiples 使用配置项 /**  * wrappe

  • js截取字符串功能的实现方法

    js截取字符串2种方式:substring().slice(),供大家参考,具体内容如下 这里给出的例子是时间. css文件: body{ text-align:center} .con{ margin:100px auto; width:800px; height:400px; border:2px solid #336666; border-radius:5px; padding-top: 50px; } <!DOCTYPE html> <html> <head>

  • javascript中使用正则表达式删除前后空格的方法

    去掉首位空格 复制代码 代码如下: str=str.replace(/^\s+|\s+$/g,''); js正则表达式删除字符串前后空格 String.prototype.trim=function(){ var reSpace=/^\s*(.*?)\s*$/; return this.replace(reSpace,"$1″); }; 让我们分析一下第二行的正则表达式 ^ 行开始 \s* 匹配字符前面的所有空格,贪婪模式重复 (.*?) 捕获组,勉强模式重复匹配任意字符,也就是我们最终需要(去

  • 浅谈react.js 之 批量添加与删除功能

    最近做的CMS需要用到批量添加图片的功能:在添加文件的容器盒子内,有两个内容,分别是:添加按钮与被添加的选择文件组件. 结构分析: 被添加的组件,我们称为:UploadQiNiuFiles(七牛文件上传组件),含一个删除当前组件的删除按钮 添加按钮的事件 被添加组件存放的容器 做这个效果只需要明白三个方法的用途就OK: 直接绑定要删除组件的  deleteType(),它是调用删除index数量的方法  removeContent() //删除{qiniu}与{deleteQiNiu}内容,是把

  • Vue.js实现一个todo-list的上移下移删除功能

    如图,A simple todo-list长这样 这是一个基于vue.js的一个简单的todo-list小demo.首先要实现添加非空list,点击list切换finished状态这样的一个效果,推荐学习地址---->点击打开链接 接下来是实现的一个上移,下移,删除的效果图: 删除效果: 讲一下思路: 上移-----首先将鼠标所指list的内容插入到上一条上面,然后删除鼠标所指的list(也就是this.items[index]),运行代码便可实现上移的效果,或者将上下两条list的内容进行调换

  • jQuery+css3实现Ajax点击后动态删除功能的方法

    本文实例讲述了jQuery+css3实现Ajax点击后动态删除功能的方法.分享给大家供大家参考.具体如下: 这里使用jquery实现ajax动态删除一个方框,并带有动画缓冲效果,在google plus网站发现的特效,在此献丑模仿了一番,已基本与Google Plusp功能相同,你可在方框中加入一些内容,jquery插件选的版本是1.6.2,更高版本也是可以的. 运行效果截图如下: 具体代码如下: <!DOCTYPE html> <head> <meta http-equiv

  • Laravel框架基于ajax和layer.js实现无刷新删除功能示例

    本文实例讲述了Laravel框架基于ajax和layer.js实现无刷新删除功能.分享给大家供大家参考,具体如下: 1.首先要引入layer.js <script type="text/javascript" src="{{ asset('/public/bootstrap/js/jquery-3.2.1.min.js') }}"></script> <script type="text/javascript" sr

随机推荐