首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React Redux容器中的状态更改

React Redux容器中的状态更改
EN

Stack Overflow用户
提问于 2018-02-15 15:14:29
回答 1查看 452关注 0票数 0

我正在尝试将登录从简单的API调用迁移到saga。当我收到数据时,我只想从其中剪切一个元素,并且不想重新加载所有列表,这个逻辑使用call.then方法来更改状态。(注释代码)我的问题是如何更改控制器中的状态以获得此结果。谢谢。

代码语言:javascript
运行
复制
import React, {Component, PropTypes} from 'react';
import {connect} from "react-redux";
import {fetchBlogPosts, deleteBlogPost} from '../../connectivity/blog/api.blog-post';
import Table from '../../components/BlogPost/Table';
import * as types from '../../constants/actionTypes';
import {REQUESTS} from '../../sagas/blog/list.blog.saga'

class List extends Component {

  constructor(props) {
    super(props);

    this.state = {
      blogPosts: []
    };
  }

  componentDidMount() {
    //method without saga
    // fetchBlogPosts()
    //   .then((data) => {
    //     this.setState(state => {
    //       state.blogPosts = data;
    //       return state;
    //     });
    //   })
    //   .catch((err) => {
    //     console.error('err', err);
    //   });

    this.props.dispatch({
      type: types.BLOGPOSTS__REQUESTED,
      payload: {
        blog: this.props.blogPosts
      }
    });
  }

  onDelete(id) {
    //method without saga
    // deleteBlogPost(id)
    //   .then((data) => {
    //     let blogPosts = this.state.blogPosts.filter((post) => {
    //       return id !== post.id;
    //     });
    //
    //     this.setState(state => {
    //       state.blogPosts = blogPosts;
    //       return state;
    //     });
    //   })
    //   .catch((err) => {
    //     console.error('err', err);
    //   });
    this.props.dispatch({
      type: types.BLOGPOST__DELETED__REQUESTED,
      payload: {
        blogPostId: id
      }
    });
  }

  render() {
    const isSubmitting = this.props.pageState.request.inProgress.indexOf(REQUESTS.BLOGPOSTS__DOREQUESTBLOGPOSTS__SAGA) > -1;
    // let blogPosts = this.state.blogPosts;
    let blogPosts = this.props.blogPosts;

    return (
      <div>
        <h3>BLOG POSTS: </h3>
        <Table blogPosts={blogPosts}
               onDelete={this.onDelete.bind(this)}
               auth={this.props.auth}
               isSubmitting={isSubmitting}
        />
      </div>
    );
  }
}

List.propTypes = {
  dispatch: PropTypes.func.isRequired,
  auth: PropTypes.object.isRequired,
  pageState: PropTypes.object.isRequired
};

function mapStateToProps(state) {
  return {
    auth: state.auth,
    blogPosts: state.blog.blogPosts,
    pageState: state
  };
}

export default connect(
  mapStateToProps
)(List);

EN

回答 1

Stack Overflow用户

发布于 2018-02-15 16:56:22

我已经修复了我的问题,通过发送一个未过滤的列表来删除saga中的操作,在我过滤之后,我将它与有效负载一起发送回来。

代码语言:javascript
运行
复制
onDelete(id) {
    this.props.dispatch({
      type: types.BLOGPOST__DELETED__REQUESTED,
      payload: {
        blogPostId: id,
        fullBlogPosts: this.props.blogPosts
      }
    });
  }

传奇:

代码语言:javascript
运行
复制
export function *doDeleteBlogPost(action) {

  try {

    const {blogPostId, fullBlogPosts} = action.payload;

    yield put({
      type: types.REQUEST__STARTED,
      payload: {
        requestFrom: REQUESTS.BLOGPOSTS__DODELETEBLOGPOST__SAGA
      }
    });

    const responseBody = yield call(api.deleteBlogPost, blogPostId);
    const blogPosts = fullBlogPosts.filter((post) => {
            return blogPostId !== post.id;
          });

    yield put({
      type: types.BLOGPOST__DELETED__SUCCEEDED,
      payload: {
        message: responseBody,
        blogPosts
      }
    }); ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48801730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档