javascript - 使用 ReactJS 旋转图像预览

标签 javascript reactjs

我正在尝试使用 ReactJS 旋转图像的预览。因此,我首先允许渲染预览的上传功能,然后在用户点击上传之前,我希望他们可以选择根据自己的喜好旋转图像。这是我用来预览图像的:

class ImageUpload extends React.Component {
constructor(props) {
  super(props);
  this.state = {file: '',imagePreviewUrl: ''};
}

_handleImageChange(e) {
  e.preventDefault();

let reader = new FileReader();
let file = e.target.files[0];

reader.onloadend = () => {
  this.setState({
    file: file,
    imagePreviewUrl: reader.result
  });
}

reader.readAsDataURL(file)
}

render() {
let {imagePreviewUrl} = this.state;
let $imagePreview = null;
if (imagePreviewUrl) {
  $imagePreview = (<img src={imagePreviewUrl} />);
} else {
  $imagePreview = (<div className="previewText"></div>);
}

return (
  <div className="previewComponent">
    <form onSubmit={(e)=>this._handleSubmit(e)}>
      <input className="fileInput" 
        type="file" 
        onChange={(e)=>this._handleImageChange(e)} />
      <button className="submitButton" 
        type="submit" 
        onClick={(e)=>this._handleSubmit(e)}>Upload Image</button>
    </form>
    <input type="button" value="< rotate" onClick="" />
    <input type="button" value="rotate >" onClick="" />
    <div className="imgPreview">
      {$imagePreview}
    </div>
  </div>
)
}}

ReactDOM.render(<ImageUpload/>, document.getElementById("mainApp"));

这就是我试图用来旋转图像的方法:

class RotateIMG extends React.Component{
constructor(props){
super(props);
this.state = {
  rotation: 0
}

this.rotate = this.rotate.bind(this);
this.rotateleft = this.rotateleft.bind(this);
}

rotate(){
  let newRotation = this.state.rotation + 90;
  if(newRotation >= 360){
    newRotation =- 360;
  }
    this.setState({
      rotation: newRotation,
    })
  }

  rotateleft(){
    let newRotation = this.state.rotation - 90;
    if(newRotation >= 360){
      newRotation =- 360;
    }
    this.setState({
      rotation: newRotation,
    })
  }

  render(){
    const { rotation } =  this.state;
    return <div><img style={{transform: `rotate(${rotation}deg)`}} src={"//blog-assets.risingstack.com/2016/Jan/react_best_practices-1453211146748.png"} width="600" />
      <input onClick={this.rotateleft} type="button" value="left" />
      <input onClick={this.rotate} type="button" value="right" />
    </div>
  }
}

const element = <RotateIMG /> 

ReactDOM.render(element, document.getElementById('root'));

据我所知,这两者似乎都可以单独工作,但我不知道从哪里开始让它们一起工作,或者是否可能。任何帮助将不胜感激!

最佳答案

看来你们真的很接近了!实际上,您在 render 方法中为条件渲染设置了良好的结构,现在返回 RotateIMG 组件,而不是返回 div:

import RotateIMG from './rotateIMG.js';
...
render() {
    const { imagePreviewUrl } = this.state;
    let $imagePreview = null;
    if (imagePreviewUrl) {
      $imagePreview = <RotateIMG src={imagePreviewUrl} />;
    } else {
      $imagePreview = <div className="previewText"></div>;
    }
    ...
}

然后,您需要调整 RotateIMG 组件以确保其已导出并停止将其直接渲染到根目录。

export default class RotateIMG extends React.Component{
  ...
  render(){
    const { rotation } =  this.state;
    return <div><img style={{transform: `rotate(${rotation}deg)`}} src={this.props.src} width="600" />
      <input onClick={this.rotateleft} type="button" value="left" />
      <input onClick={this.rotate} type="button" value="right" />
    </div>
  }
}

RotateIMG 组件中删除以下内容

const element = <RotateIMG /> 

ReactDOM.render(element, document.getElementById('root'));

关于javascript - 使用 ReactJS 旋转图像预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44530791/

相关文章:

javascript - 将对象数组过滤为新数组

javascript - 网站可以用electronjs吗

javascript - React 项目中 webpack.config.js 放在哪里?

javascript - jQuery 模板插件还是自定义函数?

javascript - 如果图像不可用,则显示文本

javascript - 使用 angularjs 将 servlet 响应发送到浏览器(下载功能)

javascript - Node/npm : File to import not found when compiling scss with node-sass

reactjs - 如何在React中清除多个输入值

javascript - react /Jest/ enzyme : How to test adding text to input and checking for that text?

javascript - 克隆多个字段值无法正常工作