简体   繁体   English

类型错误:Object.key 是只读的

[英]TypeError: Object.key is read-only

guys.伙计们。 I'm trying to implement Edit functionality on my invoice app, I pass invoice as props to form state like this:我正在尝试在我的发票应用程序上实现编辑功能,我将发票作为道具传递以形成 state,如下所示:

const EditInvoice = ({invoice}) => {
  const [formInputs, setFormInputs] = useState([
  ]);
  const [form,setForm] = useState({
      clientCity : invoice.clientAddress.city,
      clientCountry : invoice.clientAddress.country,
      clientPostCode : invoice.clientAddress.postCode,
      clientStreet : invoice.clientAddress.street,
    clientEmail : invoice.clientEmail,
    clientName : invoice.clientName,
    createdAt : invoice.createdAt,
    description : invoice.description,
    id : invoice.id,
    items: formInputs,
    paymentDue : invoice.paymentDue,
    paymentTerms : invoice.paymentTerms,
      senderCity : invoice.senderAddress.city,
      senderCountry : invoice.senderAddress.country,
      senderPostCode : invoice.senderAddress.postCode,
      senderStreet : invoice.senderAddress.street,
    status : invoice.status,
    total : invoice.total
  })

At this point everything works, handleChange function works for everything except for formInputs, i tried setting formInputs state like this const [formInputs, setFormInputs] = useState([...invoice.items]);此时一切正常,handleChange function 适用于除 formInputs 之外的所有内容,我尝试像这样设置 formInputs state const [formInputs, setFormInputs] = useState([...invoice.items]); and using useEffect, like this:并使用 useEffect,如下所示:

useEffect(() =>{
    setFormInputs([...invoice.items])
  },[])

And they both populate the fields, but if I try updating my invoice items array I get read-only type error, just in case, here's what I used for my handleChange function他们都填充了这些字段,但是如果我尝试更新我的发票项目数组,我会收到只读类型错误,以防万一,这就是我用于我的 handleChange function

const handleItemChange = (index,e) =>{
    const values = [...formInputs]
    values[index][e.target.name] = e.target.value;
    values[index].total = (values[index].price * values[index].quantity).toFixed(2);
    setFormInputs(values)
  }

Hoping you guys could provide me with solution, Thanks in advance!希望各位大神给个解决办法,先谢谢了!

I don't know if it's a hacky way to do it, but this solution seems to work.我不知道这是否是一种 hacky 方式,但这个解决方案似乎有效。

useEffect(() =>{
    invoice.items.map(item => setFormInputs(prevState => ([...prevState, {
      id : item.id,
      name : item.name,
      quantity : item.quantity,
      price : item.price,
      total : item.total
    }])))
    console.log(formInputs);
  },[])

The problem in your code is that your are trying to re-assign a const value that is read-only (it prevents the re-assignment).您的代码中的问题是您正在尝试重新分配一个只读const值(它会阻止重新分配)。 Define your values as let .将您的值定义为let

So instead of所以而不是

const values

you should define it as你应该把它定义为

let values

Because state may be updated asynchronously, you should not rely on their values for calculating the next state.由于state可能会异步更新,因此您不应依赖它们的值来计算下一个 state。

change the method like this:像这样改变方法:

const handleItemChange = (index,e) =>{
  setFormInputs(prevValues => {
    const newValues = [ ...prevValues];
    newValues[index][e.target.name] = e.target.value;
    newValues[index].total = (values[index].price * values[index].quantity).toFixed(2);
    return newValues;
  })
}

类型错误:无法分配给 object 的只读属性“项目”'#<object> '<div id="text_translate"><p> 我有这个问题一天,这是我当前的 state 结构:</p><pre> const [inputFields, setInputFields] = useState([ { item: '', quantityIssued: 0, quantityRequested: '', remarks: '', unit: '', }, ])</pre><p> 当我单击编辑按钮时,我需要将日期填写到我的 state 例如。</p><pre> const editHandler = (order) =&gt; { const custom = [ { item: 'test', quantityIssued: 0, quantityRequested: 7, remarks: '8', unit: '1', }, { item: 'test2', quantityIssued: 0, quantityRequested: 7, remarks: '8', unit: '1', }, ] setInputFields(custom) }</pre><p> 当我使用该自定义数据时,我可以编辑 state 的数据,但是当我尝试从具有相同结构的服务器中获取该数据时,我会收到错误消息,例如:</p><pre> const editHandler = (order) =&gt; { setInputFields(order.orderItems) }</pre><p> 虽然它们是我在上面向您展示的相同数据,但如果我编辑它,我无法编辑它说错误标题<strong>无法分配只读属性</strong></p><p>这是我的界面: <a href="https://i.stack.imgur.com/34ZlA.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/34ZlA.png" alt="在此处输入图像描述"></a></p></div></object> - TypeError: Cannot assign to read only property 'item' of object '#<Object>'

TypeError: 无法分配给 object 的只读属性 'children' '#<object> '<div id="text_translate"><p> 使用 docker 构建的下一个 js 在包含 getServerSideProps package.json 的所有路由中重新加载时进入内部服务器错误</p><ul><li>反应:“17.0.2”</li><li> 下一个:“^11.1.2”</li></ul><p> <strong>在本地</strong>一切正常,如果我<strong>在没有 docker 的情况下部署它</strong>。 但是在我打开网站后使用<strong>docker</strong> 。 如果我使用客户端路由器导航,一切都很好。 但是一旦我重新加载页面,它就会进入内部服务器错误并且不会重建页面<a href="https://i.stack.imgur.com/FCgpe.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/FCgpe.png" alt="在此处输入图像描述"></a></p><p> 检查 docker 日志后,我发现了这个</p><pre>TypeError: Cannot assign to read only property 'children' of object '#&lt;Object&gt;' at /app/.next/server/chunks/6859.js:792:29 at /app/node_modules/react/cjs/react.development.js:1067:17 at mapIntoArray (/app/node_modules/react/cjs/react.development.js:964:23) at mapIntoArray (/app/node_modules/react/cjs/react.development.js:1004:23) at Object.mapChildren [as map] (/app/node_modules/react/cjs/react.development.js:1066:3) at Head.makeStylesheetInert (/app/.next/server/chunks/6859.js:782:36) at Head.render (/app/.next/server/chunks/6859.js:839:23) at processChild (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3450:18) at resolve (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3270:5) at ReactDOMServerRenderer.render (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3753:22) at ReactDOMServerRenderer.read (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3690:29) at Object.renderToStaticMarkup (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:4314:27) at Object.renderToHTML (/app/node_modules/next/dist/server/render.js:711:41) at runMicrotasks (&lt;anonymous&gt;) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async doRender (/app/node_modules/next/dist/server/next-server.js:1149:38)</pre></div></object> - TypeError: Cannot assign to read only property 'children' of object '#<Object>'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 TypeError:“名称”是只读的 - TypeError: “name” is read-only 无法分配给 object 的只读属性 - cannot assign to read-only property of object 如何添加<tablerow>在for循环和Object.key之间</tablerow> - How to add <TableRow> between in for loop and Object.key 为什么使用“key”作为对象的键会导致调用 object.key 返回 null? - Why does using 'key' as an object's key cause calling on object.key to return as null? 组件第一次渲染后,对象变为只读 - Object becomes read-only after the component rendered first time 添加/删除React Grid布局示例:TypeError:“ exports”为只读 - Add/Remove React Grid Layout Example: TypeError: “exports” is read-only object.key 用于使用 object 作为 map 上的数组,不能将参数作为道具传递给 React 组件 - object.key for using object as array on map not allwoing to pass argument as props to React component ReactJs - TypeError:无法分配给对象“#”的只读属性“transform”<Object> &#39; - ReactJs - TypeError: Cannot assign to read only property 'transform' of object '#<Object>' 类型错误:无法分配给 object 的只读属性“项目”'#<object> '<div id="text_translate"><p> 我有这个问题一天,这是我当前的 state 结构:</p><pre> const [inputFields, setInputFields] = useState([ { item: '', quantityIssued: 0, quantityRequested: '', remarks: '', unit: '', }, ])</pre><p> 当我单击编辑按钮时,我需要将日期填写到我的 state 例如。</p><pre> const editHandler = (order) =&gt; { const custom = [ { item: 'test', quantityIssued: 0, quantityRequested: 7, remarks: '8', unit: '1', }, { item: 'test2', quantityIssued: 0, quantityRequested: 7, remarks: '8', unit: '1', }, ] setInputFields(custom) }</pre><p> 当我使用该自定义数据时,我可以编辑 state 的数据,但是当我尝试从具有相同结构的服务器中获取该数据时,我会收到错误消息,例如:</p><pre> const editHandler = (order) =&gt; { setInputFields(order.orderItems) }</pre><p> 虽然它们是我在上面向您展示的相同数据,但如果我编辑它,我无法编辑它说错误标题<strong>无法分配只读属性</strong></p><p>这是我的界面: <a href="https://i.stack.imgur.com/34ZlA.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/34ZlA.png" alt="在此处输入图像描述"></a></p></div></object> - TypeError: Cannot assign to read only property 'item' of object '#<Object>' TypeError: 无法分配给 object 的只读属性 'children' '#<object> '<div id="text_translate"><p> 使用 docker 构建的下一个 js 在包含 getServerSideProps package.json 的所有路由中重新加载时进入内部服务器错误</p><ul><li>反应:“17.0.2”</li><li> 下一个:“^11.1.2”</li></ul><p> <strong>在本地</strong>一切正常,如果我<strong>在没有 docker 的情况下部署它</strong>。 但是在我打开网站后使用<strong>docker</strong> 。 如果我使用客户端路由器导航,一切都很好。 但是一旦我重新加载页面,它就会进入内部服务器错误并且不会重建页面<a href="https://i.stack.imgur.com/FCgpe.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/FCgpe.png" alt="在此处输入图像描述"></a></p><p> 检查 docker 日志后,我发现了这个</p><pre>TypeError: Cannot assign to read only property 'children' of object '#&lt;Object&gt;' at /app/.next/server/chunks/6859.js:792:29 at /app/node_modules/react/cjs/react.development.js:1067:17 at mapIntoArray (/app/node_modules/react/cjs/react.development.js:964:23) at mapIntoArray (/app/node_modules/react/cjs/react.development.js:1004:23) at Object.mapChildren [as map] (/app/node_modules/react/cjs/react.development.js:1066:3) at Head.makeStylesheetInert (/app/.next/server/chunks/6859.js:782:36) at Head.render (/app/.next/server/chunks/6859.js:839:23) at processChild (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3450:18) at resolve (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3270:5) at ReactDOMServerRenderer.render (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3753:22) at ReactDOMServerRenderer.read (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:3690:29) at Object.renderToStaticMarkup (/app/node_modules/react-dom/cjs/react-dom-server.node.development.js:4314:27) at Object.renderToHTML (/app/node_modules/next/dist/server/render.js:711:41) at runMicrotasks (&lt;anonymous&gt;) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async doRender (/app/node_modules/next/dist/server/next-server.js:1149:38)</pre></div></object> - TypeError: Cannot assign to read only property 'children' of object '#<Object>'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM