反应映射上下文记录到文本输入

React mapping context record to text input

首先,我是 React 的新手,找不到问题的答案。

我想在多个 React 组件之间共享 JSON 记录的值,并在一系列文本框中显示和编辑这些值。我已经了解了组件之间的共享,但是...

问题:我无法将输入框正确映射到上下文组件中的值...请帮忙

所以我创建了一个上下文组件来表示我需要存储的数据:

数据存储:

import { useState, createContext } from 'react'

export const AddressContext = createContext();

export const AddressProvider = (props) => {
    const [address, setAddress] = useState({
        "line1": "1",
        "line2": "2",
        "line3": "3",
        "town": "4",
        "county": "5",
        "postcode": "6",
        "country": "7",
      })

    return (
<AddressContext.Provider value={[address, setAddress]}>
     {props.children}
</AddressContext.Provider>
    )
}

然后在另一个组件中显示输入框和地图值 输入与显示

import {  useContext } from 'react'
// Store for address information
import { AddressContext } from './SPLAddress'


const ShipAddress = () => {
        const [address, setAddress] = useContext(AddressContext) ;

    return (
        <div>
           <h2 >Shipping Address</h2> 

           <form className='add-form'>
           <div className='form-control'>
                        <label>Line 1:</label>
                        <input type='text' placeholder='Line1' 
                         defaultValue ={address.line1} 
                         /* onChange={(e) => address.line1 = e.target.value} */
                          /*  onChange={(e) => setAddress(changedRecord => [address, {line1: e.target.value} ]) }  */
                           onChange={(e) => setAddress(changedRecord => [address, {line1: e.target.value} ]) }  
                         />
                </div>

AND SO ON...
            </form>
        </div>
    )
}
 
export default ShipAddress

从评论中可以看出,我已多次尝试 onChange 事件,但无法让 onChange 事件更改第一个 JSON 记录中的适当值。

另外我猜想通过使用 defaultValue ={address.line1} 应用程序对值所做的任何更改都不会在 UI 中更新。使用 value={address.line1} 锁定输入。

APP级别 而在 APP 层面,我们已经用 AddressProvider

包装了组件
<AddressProvider>
      <SPLSearch searchButton={SPLsearchButton}/>

      {showSearchList &&
              <SPLList lines={lines}  selected={SPLselected}  />
      }
      {!showSearchList &&
              <ShipAddress l />
      }
  </AddressProvider>

你可以这样做:

const ShipAddress = () => {
  const [address, setAddress] = useContext(AddressContext) ;

  return (
    <div>
       <h2>Shipping Address</h2> 

       <form className='add-form'>
        <div className='form-control'>
                <label>Line 1</label>
                <input 
                  value={address.line1} 
                  onChange={e => setAddress(prevAddress => ({
                      ...prevAddress, 
                      line1: e.target.value 
                  }))}
                />
        </div>
       </form>
    </div>
  )
}