最近做的CMS需要用到批量添加图片的功能:在添加文件的容器盒子内,有两个内容,分别是:添加按钮与被添加的选择文件组件。

结构分析:

  • 被添加的组件,我们称为:UploadQiNiuFiles(七牛文件上传组件),含一个删除当前组件的删除按钮
  • 添加按钮的事件
  • 被添加组件存放的容器
  • 做这个效果只需要明白三个方法的用途就OK:
    • 直接绑定要删除组件的  deleteType(),它是调用删除index数量的方法  removeContent()

      •  //删除{qiniu}与{deleteQiNiu}内容,是把页面上的这两个内容一起删除
        deleteType(){
        let index = this.props.index;
        this.props.callbackParent(index);
        }
    • 在添加组件的容器<div className="divBorder"></div>中,为添加按钮写的 批量添加 addContent()  与删除removeContent()
      • //批量添加
        addContent(event) {
        if (this.state.number.length >= this.state.maxNum) {
        return;
        }
        console.log("this.state.number:" + this.state.number);
        this.state.number.push(this.state.number[this.state.number.length - 1] + 1);
        let temp = this.state.number;
        this.setState({
        number: temp
        })
        } //删除
        removeContent(index) {
        if (this.state.number.length <= 1) {
        return;
        }
        this.state.number.splice(index, 1);
        this.setState({
        number: this.state.number
        })
        }

代码分析:

    • 添加组件存放的容器<div className="divBorder">

      • <div className="divBorder">
        {addToBtn} //添加按钮
        {items} //被添加的组件
        </div>
        .divBorder {
        position: relative;
        width: 100%;
        height: auto;
        margin-top: 5%;
        border: 1px solid #e3e3e3;
        padding: 30px 10px;
        margin-bottom: 5%; -moz-position: relative;
        -moz-width: 100%;
        -moz-height: auto;
        -moz-border: 1px solid #e3e3e3;
        -moz-padding: 30px 10px;
        -moz-margin-bottom: 5%;
        -webkit-position: relative;
        -webkit-width: 100%;
        -webkit-height: auto;
        -webkit-border: 1px solid #e3e3e3;
        -webkit-padding: 30px 10px;
        -webkit-margin-bottom: 5%;
        }
    • 被添加的组件:UploadQiNiuFiles   与  删除组件的方法  deleteType()

    • /**
      * Created by wf on 2016/5/16.
      */
      import React,{Component} from 'react';
      import {render} from 'react-dom';
      import ReactBootstrap , {Input,Button,ButtonToolbar} from 'react-bootstrap';
      import style from '../../../../css/meeting_data.css'; //七牛上传公共组件
      import QiniuUpload from 'qiniu_uploader'; export default class UploadQiNiuFiles extends Component {
      constructor(props){
      super(props);
      } //获取qiniukey
      getQiniuKey(qiniuKey){
      this.props.setQiniuKey(qiniuKey);
      } //获取qiniutoken
      getQiniuUptoken() {
      this.props.acquireToken();
      }; //删除{qiniu}与{deleteQiNiu}内容,是把页面上的这两个内容一起删除,直接绑定要删除的组件
      //这个方法调用的是removeContent(),在下面有介绍
          deleteType(){
      let index = this.props.index;
      this.props.callbackParent(index);
      } render(){ const qiniu = (
      <div className="col-md-8 qiNiuBtn">
      <QiniuUpload containerId="containerId" pickfilesId="pickfilesId" qiniuToken={this.props.meetingState.token} callback={this.getQiniuKey.bind(this)} getQiniuUptoken={this.getQiniuUptoken.bind(this)} />
      </div>
      ); const deleteQiNiu = (
      <div className="col-md-4">
      <Button bsStyle="danger" className="deleteQiniu" onClick={this.deleteType.bind(this)}>删除</Button>
      </div> ); return(
      <div>
      <div className="uploadBox">
      {qiniu}
      {deleteQiNiu}
      </div>
      </div>
      );
      }
      }

      七牛上传组件,在http://www.cnblogs.com/post/readauth?url=/baiyygynui/p/5499255.html中巳作介绍,在制作这个组件时,需要用到action的方法与reducers中的state,请参考这个链接。因为橙色字体中的参数的获取是需要用到action中的方法

  • 在div为divBorder的容器内操作添加事件
    • 首先要加载,七牛上传组件:UploadQiNiuFiles,它的加载路径为webpack中的方法:
    • /**常用组件路径简写为:
      *
      * 例:config: path.join(__dirname,"./build/config.js")
      * config 变量名
      * path.join(__dirname,"./build/config.js") config的路径
      *
      * 使用方法: import {变量} from 'config'
      * //七牛上传公共组件
      import QiniuUpload from 'qiniu_uploader';
      * **/
      resolve: {
      alias: {
      qiniu_uploader: path.join(__dirname,"./public_component/qiniu_upload/QiniuUpload.js"),
      storage: path.join(__dirname,"./utils/Storage.js"),
      config: path.join(__dirname,"./build/config.js")
      }
      }
      import React,{Component} from 'react';
      import {render} from 'react-dom';
      import ReactBootstrap , {Input,Button,ButtonToolbar} from 'react-bootstrap';
      import { Link } from 'react-router';
      //
      import UploadQiNiuFiles from './UploadQiNiuFiles.js';
    • 批量上传文件的组件名称,我定义为:UploadFileToFolde     
    • 默认参数为:
    • constructor(props){
      super(props);
      this.state = {number: [1], maxNum: 10} //最大数据为10条,默认显示1条
      }
    • /*获取上个页面传过来的值 let local = this.props.location;
      如果从(row,query)中跳转过来的页面,从query中传值过来要这么写:let query = local.query;
      如果这个页面是包含在某个大的页面下的,要把query与对应的ID传过去
      */
      componentDidMount(){
      let local = this.props.location;
      let query = local.query;
      this.props.setActivityId(query.activityId);
      }
    • 数据渲染完成之后,需要执行componentDidUpdate(),这是state中所有的数据:this.props.meetingState.addUploadFolderToFileList; 判断这里面的数据是否为空或是undefined。如果这个state有值且新增成功,则下次到这个页面时清空所有的数据并且点击保存按钮时返回到原来的页面。clearInvitation() 的方法是清空所有的业务数据,它的方法写在action中,data是业务数据,根据实际情况写:
    • /* 清空*/
      export const CLEAR_INVITATION = 'CLEAR_INVITATION';
       export function clearInvitation(){
      return {
      type: CLEAR_INVITATION,
      data:{
      addInvitationResponse:{},
      Invitations:[],
      deleteInvitationsResponse:{},
      invitationName:
      '',
      folderName: ''

      }
      }
      }
    • componentDidUpdate(){
      let addFileToFolderList = this.props.meetingState.addUploadFolderToFileList;
      if (typeof(addFileToFolderList) != 'undefined') {
      let status = addFileToFolderList.status;
      if (200 == status) {
      //如果新增成功,则下次添加前清空所有
      this.props.clearInvitation();
      //点击保存按钮,返回原来的页面
      this.props.history.goBack();
      }
      }
      }
      //批量添加,直接拿来使用
      addContent(event) {
      if (this.state.number.length >= this.state.maxNum) {
      return;
      }
      console.log("this.state.number:" + this.state.number);
      this.state.number.push(this.state.number[this.state.number.length - 1] + 1);
      let temp = this.state.number;
      this.setState({
      number: temp
      })
      }
      //删除,直接拿来使用
      removeContent(index) {
      if (this.state.number.length <= 1) {
      return;
      }
      this.state.number.splice(index, 1);
      this.setState({
      number: this.state.number
      })
      }
    • 七牛上传组件中 有个  deleteType() 的删除方法,它调的就是  removeContent() 方法,缺一不可,需要注意,我把这个deleteType()方法代码也放在这里:
    • //绑定被删除的组件,直接拿来使用
      deleteType(){
      let index = this.props.index;
      this.props.callbackParent(index); //调用removeContent()方法
      }
      render(){
         //将要添加的组件定义为变量为一个数组 items
      let items = [];
         //从添加的组件数量中遍历,
      for(let i = 0; i < this.state.number.length; i++){
      //给这个items推送组件
      items.push(<UploadQiNiuFiles index={i}
      callbackParent={this.removeContent.bind(this)}
      key={this.state.number[i]} {...this.props} />)
      } const addToBtn = (
      <Button bsStyle="primary" onClick={this.addContent.bind(this)}>添加</Button>
      );return (
      <div>
      <div>
      <div className="divTitle">添加文件</div>
      <div className="divBorder">
      {addToBtn}
      {items}
      </div>
      </div></div>
      );
      }

react.js 之 批量添加与删除功能的更多相关文章

  1. 百度地图API 批量添加 带检索功能的信息窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. js数值的添加与删除

    js中数组元素的添加和删除 js中数组元素常用添加方法是直接添加.push方法以及unshift方法 删除方法则是delete.pop.shift 集修改方法为一身的则是splice 1.添加: (1 ...

  3. 使用vue实现用户管理 添加及删除功能

    简单的管理系统-增删改查 添加及删除功能 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&qu ...

  4. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

  5. 从源码的角度看 React JS 中批量更新 State 的策略(下)

    这篇文章我们继续从源码的角度学习 React JS 中的批量更新 State 的策略,供我们继续深入学习研究 React 之用. 前置文章列表 深入理解 React JS 中的 setState 从源 ...

  6. Windows批量添加和删除IP

    随着天气变冷了,好多小伙伴都开始变懒了,都想用最快的方式完成任务 下面给大家介绍一下Windows批量添加和删除IP的办法 (1)批量添加IP 直接在CMD下边运行下边命令. for /l %i in ...

  7. ado.net 批量添加 更新 删除

    自曾列就别往下看 别折腾了   使用 SqlBulkCopy ,dataTable 必须跟sql里面的表字段完全一样 下面在sqlserver中演示 mysql 请google MySqlBulkLo ...

  8. JS实现动态添加和删除div

    实现方式一:只在最后一个数据中动态添加或者删除 | 背景需要做一个页面,页面可以输入参数,点击确认按钮可以发请求给某接口.但是接口的某个字段是数组类型,所以在页面上需要实现添加或者删除元素的功能. | ...

  9. SqlServer——批量操作(批量添加,删除)

    批量添加数据: 一条insert语句批量插入多条记录 常见的insert语句,向数据库中,一条语句只能插入一条数据: insert into persons (id_p, lastname , fir ...

随机推荐

  1. 校园导游系统(C++实现,VC6.0编译,使用EasyX图形库)

    运行效果: 说明: 由于当年还不会使用多线程,所以很多获取用户点击的地方都是使用循环实现的...CPU占用率会比较高. 代码: //校园导游系统.cpp 1 #include <graphics ...

  2. POJ1270 Following Orders[拓扑排序所有方案 Kahn]

    Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4885   Accepted: 1973 ...

  3. mysql中char与varchar的区别分析

    char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例 建意: myisam 存储 ...

  4. hdu 4027

    Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65768/65768 K ...

  5. Volley(二)—— 基本Request对象 & RequestQueue&请求取消

    详细解读Volley(一)—— 基本Request对象 & RequestQueue&请求取消 Volley它非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作, ...

  6. FFT入门

    这篇文章会讲讲FFT的原理和代码. 先贴picks博客(又名FFT从入门到精通):http://picks.logdown.com/posts/177631-fast-fourier-transfor ...

  7. 漫谈python中的搜索/排序

    在数据结构那一块,搜索有顺序查找/二分查找/hash查找,而排序有冒泡排序/选择排序/插入排序/归并排序/快速排序.如果遇到数据量和数组排列方式不同,基于时间复杂度的考虑,可能需要用到混合算法.如果用 ...

  8. shell 删除某个目录下的重复文件

    #!/bin/bash ls -lS | awk 'BEGIN{ getline; getline; name1=$;size=$; } { name2=$; sizeTmp=$; ){ ; ; if ...

  9. PAT 1013. 数素数 (20)

    令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到PN的所有素数 ...

  10. GT考试(bzoj 1009)

    Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...