最近做的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. Qt 静态编译后的exe太大, 可以这样压缩.

    1. 下载PECompact 下载地址:http://download.csdn.net/download/sniper_bing/7669247 ,  不行大家就去baidu搜索下载就可以了这个是绿 ...

  2. HQL基础查询语句

    HQL基础查询语句 1.使用hql语句检索出Student表中的所有列 //核心代码 @Test public void oneTest() { Query query=session.createQ ...

  3. java中使用二重循环打印图形

    如图所示:打印沙漏图形 1:因为外层循环控制图形行数,所以首先判断这四个选项能否循环五次 2:以上四个循环的表达式都能循环五次,我们从内层循环入手. A:int i=0;i<5;i++ 当i=1 ...

  4. [No00004E]千万不要“拼命”工作——写在滴滴总裁柳青患癌症之后

    滴滴快的总裁柳青发内部信,透露自己检查出乳腺癌,她今年才37岁. 9月30日,就是国庆前一天,柳青发了内部信,透露了这个消息,她也说已经做完肿瘤摘除手术,"目前感觉还挺好的".她也 ...

  5. nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题

    问题说明:测试机上部署了一套业务环境,nginx反向代理tomcat,在访问时长时间处于加载中,十分缓慢! 通过浏览器调试(F12键->Console),发现有错误ERR_CONTENT_LEN ...

  6. django复习笔记3:实战

    1.初始化 2.配置后台,增加测试数据 3.测试urls/views/templates 4.增加静态资源 5.修改样式 6.模版继承 7.增加博文主页 8.增加表单 9.完善新增页面和编辑页面的表单 ...

  7. js 点击默认另存 ,不是打开 Blob 操作

    function savepic(obj) { if (memFileObj != undefined) { obj = memFileObj; } else { memFileObj = obj; ...

  8. 解决jquery.validate.js的验证bug

    版本提示:jq为1.4.4, jquery.validate 为jQuery validation plug-in 1.7 问题: a.选填选项,如邮箱设置格式验证,那么情况输入框,验证label变成 ...

  9. Javascript Math.ceil()与Math.round()与Math.floor()区别

    Math.ceil()向上舍入 1 2 3 alert(Math.ceil(20.1)) //输出 21 alert(Math.ceil(20.5)) //输出 21 alert(Math.ceil( ...

  10. BZOJ 1854 【Scoi2010】 游戏

    Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...