【问题标题】:Redux state updates without dispatches无需分派的 Redux 状态更新
【发布时间】:2020-04-22 07:39:46
【问题描述】:

我正在使用 multer 处理上传到我的 Next.js 应用程序的图像。

令人困惑的问题是上传的图像不存在。

这是ImageUploader.js 组件:

import React, { Component } from 'react';
import './ImageUploader.css';
import Modal from '../Modal/MyModal.jsx'
import axios from 'axios';


import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import { loadAvatar } from '../../store/reducers/users/index'
import { modalStateOn, modalStateOff } from '../../store/reducers/ui/index'


// base api url being used
class ImageUploader extends Component {
 constructor(props) {
  super(props);
 }

 componentDidMount() {
  this.setDefaultImage()
 }

 componentDidUpdate(previousProps, previousState) {
  if (previousProps.userAvatar !== this.props.userAvatar) {

  console.log("this.props.userAvatar in componentDidUpdate", this.props.userAvatar);
   loadAvatarImage(this.props.userAvatar)
  }
 }

 setDefaultImage(){
   var defaultImage =  '../../static/profile-avatars/assets/default-img.jpg';
    this.loadAvatarImage(defaultImage)
 }

 loadAvatarImage(img) {
    var { loadAvatar } = this.props;
     loadAvatar(img)
 }
 // function to upload image once it has been captured
 // includes multer and firebase methods
 uploadImage(e, method) {
  let imageObj;

  imageObj = {};
  if (method === "multer") {

   let imageFormObj = new FormData();

   imageFormObj.append("imageName", "multer-image-" + Date.now());
   imageFormObj.append("imageData", e.target.files[0]);
   this.loadAvatarImage(window.URL.createObjectURL(e.target.files[0]))

   axios.post(`http://localhost:8016/images/uploadmulter`, imageFormObj)
    .then((data) => {
     if (data.data.success) {
      console.log("data ", data);
      this.setDefaultImage();
     }
    })
    .catch((err) => {
     alert("Error while uploading image using multer");
      this.setDefaultImage();
    });
  }
 } // end upload function

 render() {
  // var {imageUploaded} = this.state;
  var {  userAvatar } = this.props
 console.log("this.props ImageUploader", this.props);
  return (
   <>
    <div className="main-container">
     <h3 className="main-heading">Image Upload App</h3>

     <div className="image-container">
      <div className="process">
       <h4 className="process__heading">Process: Using Multer</h4>
       <p className="process__details">Upload image to a node server, connected to a MongoDB database, with the help of multer</p>
       <form action="/uploadmulter" method="post" encType="multipart/form-data" >
        <input type="file" name="avatar" className="process__upload-btn" onChange={(e) => this.uploadImage(e, "multer")} />
        <img src={userAvatar} alt="upload-image" className="process__image" />
       </form>
      </div>
     </div>
    </div>
  </>
  );
 }
}

function mapStateToProps(state) {
 const { ui, users } = state
 const { isLoggedIn, userAvatar } = users
 const { modalActive } = ui

 return { isLoggedIn, userAvatar, modalActive }
}

const mapDispatchToProps = dispatch =>
 bindActionCreators({ loadAvatar, modalStateOn, modalStateOff }, dispatch)

export default connect(mapStateToProps, mapDispatchToProps)(ImageUploader)

我认为这两种生命周期方法可以作为故障保险,让我弄清楚发生了什么......

 componentDidMount() {
  this.setDefaultImage()
 }

 componentDidUpdate(previousProps, previousState) {
  if (previousProps.userAvatar !== this.props.userAvatar) {

  console.log("this.props.userAvatar in componentDidUpdate", this.props.userAvatar);
   loadAvatarImage(this.props.userAvatar)
  }
 }

但是componentDidUpdate 中的console.log 甚至不会触发?

在这里您可以看到加载图像操作被多次触发???

任何想法为什么会发生这种情况以及如何让我的形象持续存在?

感谢您的任何意见!!!

【问题讨论】:

  • LOAD_USER_AVATAR 的减速器真的改变了你的状态对象的正确属性吗?我建议检查处理该操作的减速器

标签: reactjs express redux multer


【解决方案1】:

在我看来,问题就在这里:

loadAvatarImage(img) {
    var { loadAvatar } = this.props;
     loadAvatar(img)
 }

您直接调用 loadAvatar 操作,而不是通过 Redux 调度它。也许尝试将其更改为

loadAvatarImage(img) {
    var { loadAvatar } = this.props;
     this.props.loadAvatar(img)
 }

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2017-04-13
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多