javascript - onChange object in state in React - Stack Overflow

I want to add a new state in object after checked input. Item state is an object with another object in

I want to add a new state in object after checked input. Item state is an object with another object inside

const [item, setItem] = useState({
    series: '',
    model: '',
    addons: {
      gps: false,
      wifi: false,
      esim: false,
    },
    price: ''
})

Change series, model on input by value is obvious but how Can I change objects in addons? I can't do this by

onChange={(e) => setItem({ ...item, gps: e.target.checked })}

or

onChange={(e) => setItem({ ...item, addons.gps: e.target.checked })}

Code:

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

export default function App() {
  const [item, setItem] = useState({
    series: '',
    model: '',
    addons: {
      gps: false,
      wifi: false,
      esim: false,
    },
    price: ''
  })


  const sendItem = () => {
    console.log(item, 'add item')
  }
  
  return (
    <div>
      <form onSubmit={sendItem}>
      <div>
       <label htmlFor="series">Series:</label>
              <input
                name="series"
                label="series"
                type="text"
                value={item.series}
                onChange={(e) => setItem({ ...item, series: e.target.value })}
              />
        </div>
        <div>
       <label htmlFor="model">Model:</label>
              <input
                name="model"
                label="model"
                type="text"
                value={item.model}
                onChange={(e) => setItem({ ...item, model: e.target.value })}
              />
        </div>
        <div style={{display: 'flex', flexDirection: 'row', justifyContect: 'center', alignItems: 'center'}}>
       <label htmlFor="addons">Addons:</label>
       <p>GPS:</p>
              <input
                name="gps"
                type="checkbox"
                onChange={(e) => setItem({ ...item, gps: e.target.checked })}
              />
        <p>Wifi:</p>
              <input
                name="wifi"
                type="checkbox"
                onChange={(e) => setItem({ ...item, wifi: e.target.checked })}
              />
         <p>Esim:</p>
              <input
                name="esim"
                type="checkbox"
                onChange={(e) => setItem({ ...item, esim: e.target.checked })}
              />
        </div>
         <div>
       <label htmlFor="price">Price:</label>
              <input
                name="price"
                label="price"
                type="text"
                value={item.price}
                onChange={(e) => setItem({ ...item, price: e.target.value })}
              />
        </div>


        <button type="submit">Send</button>
      </form>
    </div>
  );
}

I want to add a new state in object after checked input. Item state is an object with another object inside

const [item, setItem] = useState({
    series: '',
    model: '',
    addons: {
      gps: false,
      wifi: false,
      esim: false,
    },
    price: ''
})

Change series, model on input by value is obvious but how Can I change objects in addons? I can't do this by

onChange={(e) => setItem({ ...item, gps: e.target.checked })}

or

onChange={(e) => setItem({ ...item, addons.gps: e.target.checked })}

Code:

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

export default function App() {
  const [item, setItem] = useState({
    series: '',
    model: '',
    addons: {
      gps: false,
      wifi: false,
      esim: false,
    },
    price: ''
  })


  const sendItem = () => {
    console.log(item, 'add item')
  }
  
  return (
    <div>
      <form onSubmit={sendItem}>
      <div>
       <label htmlFor="series">Series:</label>
              <input
                name="series"
                label="series"
                type="text"
                value={item.series}
                onChange={(e) => setItem({ ...item, series: e.target.value })}
              />
        </div>
        <div>
       <label htmlFor="model">Model:</label>
              <input
                name="model"
                label="model"
                type="text"
                value={item.model}
                onChange={(e) => setItem({ ...item, model: e.target.value })}
              />
        </div>
        <div style={{display: 'flex', flexDirection: 'row', justifyContect: 'center', alignItems: 'center'}}>
       <label htmlFor="addons">Addons:</label>
       <p>GPS:</p>
              <input
                name="gps"
                type="checkbox"
                onChange={(e) => setItem({ ...item, gps: e.target.checked })}
              />
        <p>Wifi:</p>
              <input
                name="wifi"
                type="checkbox"
                onChange={(e) => setItem({ ...item, wifi: e.target.checked })}
              />
         <p>Esim:</p>
              <input
                name="esim"
                type="checkbox"
                onChange={(e) => setItem({ ...item, esim: e.target.checked })}
              />
        </div>
         <div>
       <label htmlFor="price">Price:</label>
              <input
                name="price"
                label="price"
                type="text"
                value={item.price}
                onChange={(e) => setItem({ ...item, price: e.target.value })}
              />
        </div>


        <button type="submit">Send</button>
      </form>
    </div>
  );
}
Share Improve this question edited Feb 10, 2021 at 16:00 Abraham 9,9056 gold badges56 silver badges58 bronze badges asked Feb 10, 2021 at 15:51 Arex SpeedArex Speed 1772 silver badges11 bronze badges 3
  • The reason it doesn't work is because of this: What is event pooling in react? – Emile Bergeron Commented Feb 10, 2021 at 16:08
  • And the spread syntax explained by @jnpdx – Emile Bergeron Commented Feb 10, 2021 at 16:10
  • You can reference this https://stackoverflow./questions/43638938/updating-an-object-with-setstate-in-react – Akhil G Krishnan Commented Feb 10, 2021 at 16:52
Add a ment  | 

1 Answer 1

Reset to default 7
setItem({ ...item, addons: {...item.addons, gps: e.target.checked} })

You can spread both item and addons, allowing you to only update the property of addons that you need to change.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745246081a4618417.html

相关推荐

  • javascript - onChange object in state in React - Stack Overflow

    I want to add a new state in object after checked input. Item state is an object with another object in

    4小时前
    20

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信