I'm experiencing some odd behavior with react's useState hook. I would like to know why this is happening. I can see a few ways to sidestep this behavior, but want to know whats going on.
I am initializing the state with the following const:
const initialValues = {
  order_id: '',
  postal_code: '',
  products: [
    {
      number: '',
      qty: ''
    }
  ]
}
const App = (props) => {
  const [values, setValues] = React.useState(initialValues);
...
products is an array of variable size. As the user fills in fields more appear.
The change handler is:
  const handleProductChange = (key) => (field) => (e) => {
    if (e.target.value >= 0 || e.target.value == '') {
      let products = values.products;
      products[key][field] = e.target.value;
      setValues({ ...values, products });
    }
  }
What I am noticing is that if I console log initialValues, the products change when the fields are changed. None of the other fields change, only inside the array.
Here is a codepen of a working example.
How is this possible? If you look at the full codepen, you'll see that initialValues is only referenced when setting default state, and resetting it. So I don't understand why it would be trying to update that variable at all. In addition, its a const declared outside of the component, so shouldn't that not work anyway?
I attempted the following with the same result:
const initialProducts = [
  {
    number: '',
    qty: ''
  }
];
const initialValues = {
  order_id: '',
  postal_code: '',
  products: initialProducts
}
In this case, both consts were modified.
Any insight would be appreciated.
 
     
    