-2

I have a component that doesn't re-render when the state variable changes and I don't understand why. Here is the code:-

export default function SalesItem(props) {
    const classes = useStyles();
    const api = new API();
    const [salesItem, setSalesItem] = React.useState(null);
    const [site, setSite] = React.useState(null);

    useEffect(() => {
        api.getSite(props.siteCode).then((site) => {
            setSite(site);
            api.getSalesItem(site.SiteID, props.salesItem).then((salesItem) => {
                setSalesItem(salesItem);
            })
        })
    }, [])

    return (
        <form className={classes.root} noValidate autoComplete="off">
            <Input
                defaultValue={salesItem === null ? "test" : salesItem.Description}
                inputProps={{ 'aria-label': 'description' }}
                fullWidth
                />
        </form>
        )
}

The values of site and salesItem do change but the Input field only ever displays "test" which tells me that the component isn't re-rendering and I cannot figure out why.

Stephen Clay
  • 107
  • 7

1 Answers1

0

You should set the value instead of the defaultValue:

import React, { useState } from "react";
import "./styles.css";

export default function App() {
  const [value, setValue] = useState("default value");

  const updateValue = (e) => {
    const newValue = e.target.value;

    if (newValue !== value) {
      setValue(newValue);
    }
  };

  return (
    <>
      <button onClick={() => setValue("foo")}>inject value "foo"</button>
      <button onClick={() => setValue("bar")}>Inject value "bar"</button>
      <input value={value} onChange={updateValue} />
      <p>Current value is: "{value}"</p>
    </>
  );
}

Here is a CodeSandbox to play around with.

Titulum
  • 9,928
  • 11
  • 41
  • 79