【问题标题】:React/Redux : State Updated but component not refreshingReact/Redux:状态已更新但组件未刷新
【发布时间】:2018-09-25 08:25:37
【问题描述】:

我正在使用 React/Redux 构建一个应用程序。

这是 Json:

{
  "categories": [
    {
      "id": 1,
      "name": "category 1",
      "slug": "category-1"
      "content": [
        {
          "id": 1,
          "title": "title 1 "
        },
        {
          "id": 2,
          "title": "title 2 "
        }
      ]
    }
  ]
}

我想做的是为一个类别添加内容。

  • 路径“/categories” = 类别列表
  • 我点击类别,我被重定向到“/categories/id”=列表 此类别的内容。

我正在尝试添加内容。 当我添加内容(“标题”)时,我的状态会更新,但我的组件不会。

这是我的 app.js

const App = () => (
    <Router>
        <div className="container">         
            <Navbar/>           
            <hr/>
            <Route exact path="/(categories|)/" component={CategoryList} />
                <Route exact path="/categories/:id" component={CategoryDetail} />
        </div>
    </Router>
);

CategoryDe​​tail 组件

    class CategoryDetail extends Component {

        getDetail() {
            console.log("getdetail here");      
            const detail = this.props.categorySelected.content.map((content) =>
                <div key={content._id}> 
                    <p> <strong>{content.title}</strong></p>
                </div>
            );

            return (
                <div>
                    {detail}
                </div>
            );      
        }

        render() {
            return (
                <div>
                    <div>
                        {this.getDetail()}
                    </div>
                    <hr/>
                    <CategoryAddContent/>   
                </div>          
            );
        }
    }

    function mapStateToProps (state) {
        return {        
            categorySelected: state.categories.categorySelected 
        };  
    }
    export default connect(mapStateToProps)(CategoryDetail);

当我提交新内容时,没有打印控制台日志“getdetail here”。这意味着该组件未加载。但我不知道如何解决这个问题。

然后是 CategoryAddContent 组件

    class CategoryAddContent extends Component {

    constructor(props) {
        super(props);
        this.state = {title: "",};
        this.onSubmit = this.onSubmit.bind(this);
    }

    onSubmit(e){
        e.preventDefault();
        const contentData = {title: this.state.title};
        this.props.createCategoryContent(this.props.categorySelected, contentData);
        this.setState({title : ""});
    }

    render() {
        return (
            <div>
                <h3>Add content</h3>
                <form onSubmit={this.onSubmit}>
                    <div>
                        <label>name: </label> <br/>
                        <input
                            type="text" 
                            name="name" 
                            value={this.state.name}
                        />
                    </div>
                    <input 
                        type="submit" 
                        value="Submit" 
                    />
                </form>         
            </div>
        );
    }
}


// reducer
function mapStateToProps (state) {
    return {
        categorySelected: state.categories.categorySelected
    };  
}

export default connect(mapStateToProps, { createCategoryContent })(CategoryAddContent);

createCategoryContent 的动作创建者

export const createCategoryContent= (categoryContent, newContent) => dispatch => {
        categoryContent["content"] = [...categoryContent["content"], newContent];
        dispatch ({
            type: NEW_CATEGORY_CONTENT,
            payload: categoryContent
        })
    };

这里是减速器:

case NEW_CATEGORY_CONTENT:
    return {
        ...state,
        categorySelected: action.payload
    };

我们来了!

状态已更新,但组件未更新。

这里是状​​态:

之前

categories
- categoryItems {//all categories here}
- categorySelected:id:"XX", name: "XX", slug:"XX", content:[0] // 1 array

之后

categories
- categoryItems {//all categories here}
- categorySelected:id:"XX", name: "XX", slug:"XX", content:[0, 1] // 2 arrays

【问题讨论】:

  • 该州的“头衔”是什么?我没有看到用法
  • createCategoryContent 中有一个突变。尝试删除categoryContent["content"] = .. 并使用payload: {...categoryContent, content: [...categoryContent.content, newContent]}

标签: reactjs react-redux components state


【解决方案1】:

您能否考虑创建一个不同的函数来获取您的动作创建者。成功创建类别后,您可以调用您在动作创建者文件中声明的动作创建者。这可以最好地与 Promise 一起使用。

【讨论】:

  • 哼..有道理。你可以告诉我更多关于它,PLZ
  • 假设您正在从您的 API 进行调用。你显然希望得到回应。正确的??因此,如果操作成功,则使用承诺将返回状态代码 200 下的任何内容。 .catch 然后在操作不成功并且服务器或 API 返回 400 或 500 后返回。现在,您如何调用创建类别的动作创建者,您希望从 API 返回某些内容,因此您将在 .then() 承诺中使用 .then(),您将在其中调用动作创建者以获取类别。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多