【问题标题】:React mapping context record to text input将映射上下文记录反应到文本输入
【发布时间】:2021-10-03 14:40:04
【问题描述】:

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

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

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

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

数据存储:

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

从 cmets 中可以看出,我曾多次尝试 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>

【问题讨论】:

    标签: reactjs react-context


    【解决方案1】:

    你可以这样做:

    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>
      )
    }
    

    【讨论】:

    • 那将添加另一条记录。向结构中添加记录的大量示例随处可见。这都是关于编辑单个记录的。对不起
    • 对不起,我误解了,所以我认为您正在尝试为地址对象中的每个键创建一个输入并获取它们的值。我更新了代码,只为一个键创建一个输入,并为其创建状态更新函数。请试试这个@SamSmith
    • 并且还想提一下您的代码有什么问题: 1. 在第一条评论中,您尝试直接更新状态。这在反应中是不可能的。 2. 在您的第二个和第三个 cmets 中,您尝试正确更新状态一半。您的状态是一个对象,但是您从传递给 setState 函数的回调中返回一个数组,而不是一个对象。 3. 同样在您的第二条和第三条评论中,您从回调中获得了最新状态,但是您正在使用地址状态。只需选择一个,直接使用 state 或回调中的最新 state 参数
    • 太好了,非常感谢。它实际上似乎挽救了整个事件,但稍作改动,它就可以按我的需要工作。已编辑上述代码。非常感谢
    • 感谢您的编辑。更新了我的答案。如果您能接受我的回答,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多