Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

State is being changed, but display not updating

I’ve seen quite a few posts about this, but none of the solutions seem to work for me.

I have a render method that is being mapped to list the different sections stored in a state(this part works as expected):

render() {
        return (
            <ThemeProvider theme={theme}>
                <Div>
                    <hr />
                    <div>
                        {this.state.sections.map(section => (
                            <div
                                className="mb-3"
                                key={section.section_title}
                            >
                                <h3>{section.section_title}</h3>
                            </div>
                        ))}
                    </div>
        )
    }

However, I have a modal that allows you to create a new section by giving it a name and clicking submit. That does create it and add it to my database table as expected. But, then when I run the method to pull that data down, and change the state to include the new section, it works, and does indeed change the state to include the new section. But it does not update the display unless I reload the page. Can anyone see why?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

getProjectSections(projId) {
        fetch(API_URL + `/billingcalculator/sections/distinct/${projId}`)
            .then((res) => {
                if (!res.ok) {
                throw new Error()
                }
                return res.json()
            })
            .then((result) => {
                let listedSections = [...result];
                this.setState({ sections: listedSections });
            })
            .catch((error) => {
                console.log(error);
        })
    }

the getProjectSections() runs when you click the submit button a creating a new section which runs this:

handleSectionCreateSave() {
        fetch(API_URL + `/billingcalculator/section/create`, {
            method: "PUT",
            body: JSON.stringify({
                projectId: this.props.billProjId,
                sectionTitle: this.state.newSectionTitle
            }),
            headers: { "Content-Type": "application/json" },
        })
            .then((res) => {
                if (!res.ok) {
                    throw new Error();
                }
                return res.json();
            })
            .then((data) => console.log(data))
            .catch((err) => console.log(err))
            .then(this.getProjectSections(this.props.billProjId))
            .then(this.setState({ showSectionModal: false }))
            .catch((err) => console.log(err));
    }

>Solution :

You are calling state updates before request happens:

handleSectionCreateSave() {
    fetch(API_URL + `/billingcalculator/section/create`, {
        method: "PUT",
        body: JSON.stringify({
            projectId: this.props.billProjId,
            sectionTitle: this.state.newSectionTitle
        }),
        headers: { "Content-Type": "application/json" },
    })
        .then((res) => {
            if (!res.ok) {
                throw new Error();
            }
            return res.json();
        })
        .then((data) => console.log(data))
        .catch((err) => console.log(err))
        // you called these function now, instead after fetch
        // use () => 
        .then(() => this.getProjectSections(this.props.billProjId))
        .then(() => this.setState({ showSectionModal: false }))
        .catch((err) => console.log(err));
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading