javascript - this.setState 不是一个函数(尝试上传图像)ReactJs

标签 javascript reactjs image-upload

尝试使用cropper组件创建上传功能。但是当我尝试设置状态时它说

Uncaught TypeError: this.setState is not a function at FileReader.reader.onload

组件

import React, { Component, PropTypes } from 'react'
import { Link, browserHistory } from 'react-router'
import { connect } from 'react-redux'
import Cropper from 'react-cropper';

class HeadPortrait extends Component {
  constructor(props) {
    super(props)
    this.state = {
      image: '',
    }
  }

  clickadd(e) {
    document.getElementById('uploadfiles').click();
  }

  loadFile(e) {
    e.preventDefault();
    var reader = new FileReader();
    reader.onload = function () {
      this.setState({ image: reader.result })
    };
    reader.readAsDataURL(e.target.files[0]);
    ;
  };

  _crop() {
    // image in dataUrl
    console.log(this.refs.cropper.getCroppedCanvas().toDataURL());
  }

  render() {
    return (
      <div className="group-content width415">
        <input id="uploadfiles" type="file" accept="image/*" onChange={this.loadFile.bind(this)}></input>
        <a onClick={this.clickadd.bind(this)} className="gt-btn-small gt-left ">Add Image</a>
        <div>
          <div className="bigImageprev gt-left"><img width="300" height="300" id="output" /></div>
        </div>
        <div className="gt-clear"></div>
        <div className="btnSaveImage gt-right"><a className="gt-btn-small" href="#">Save</a></div>

        <Cropper
          ref='cropper'
          src={this.state.image}
          style={{ height: 400, width: '100%' }}
          // Cropper.js options
          aspectRatio={16 / 9}
          guides={false}
          crop={this._crop.bind(this)} />
      </div>
    )
  }
}

function mapStateToProps(state) {
  return {
    // stories: state.stories
  }
}

export default connect(mapStateToProps)(HeadPortrait)

尝试像示例 https://github.com/roadmanfong/react-cropper/blob/master/example/src/Demo.jsx 那样做

最佳答案

问题是您用于onload函数:this没有您的类this。尝试使用箭头函数:

reader.onload = () => this.setState({ image: reader.result })

或者将 this 分配给之前的变量

const scope = this
reader.onload = function () {
  scope.setState({ image: reader.result })
}

此外,值得在构造函数中绑定(bind)事件处理程序而不是直接在渲染中绑定(bind),因为这样无论状态如何变化,您都将重新渲染组件 - 因为事件处理程序每​​次都是一个新引用:

constructor(props) {
  super(props)
  this.state = {
    image: '',
  } 
  this.loadFile = this.loadFile.bind(this) // properly bound once
}

渲染中:

<input onChange={this.loadFile}></input>

关于javascript - this.setState 不是一个函数(尝试上传图像)ReactJs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42479125/

相关文章:

javascript - exceljs - 将填充应用于单元格范围

Javascript 将对象推送到全局数组会覆盖以前的值吗?

php - 在表单提交之前查看图像的预览

php - 图片已上传但未存储

javascript - 当文本输入到 Textarea 时,如何在 div 中显示文本

javascript - 我们如何在不删除状态字段的情况下进行更新? (在 React/JavaScript 中)

css - 在 React 中更改样式表

javascript - React 渲染 Bootstrap 网格单元格中的对象数组

c# - 如何在asp.net mvc 4中上传图片并显示在同一页面上

javascript - 使用 jQuery Tokeninput 时如何使匹配字符变为粗体+红色