Передача данных через из дочернего компонента в context provider React js
У меня есть модальное окно и дальний компонент "Page". Я передаю значения из модального окна в GrandParent компонент через контекст, но данные в провайдере не видны
Modalbuy.js
import React, {useState} from "react";
import "./modal.css";
import { DataBuyContext } from "../../page/page";
const Modalbuy = ({active, setActive,price}) => {
const [inputVolume, setInputVolume] = useState("")
function saveInput(event) {
setInputVolume(event.target.value)
console.log(inputVolume)
}
const {dataBuy, setDataBuy} = React.useContext(DataBuyContext)
function addBuy() {
setDataBuy([...dataBuy,{side: "BUY", price:{price},volume: {inputVolume},timestamp: new Date().toLocaleTimeString()}])
// console.log(dataBuy)
}
return (
<div className={active ? "modal active" : "modal"} onClick={() => setActive(false)}>
<div className="modal__content" onClick={e => e.stopPropagation()}>
<header>Make order</header>
<p>BUY {price}</p>
<input placeholder="Volume" value={inputVolume} onChange={saveInput}></input>
<div>
<button onClick = {addBuy}>Ok</button>
<button onClick={() => setActive(false)} >Cancel</button>
</div>
</div>
</div>
)
}
export default Modalbuy;
Page.js
import React, {useState} from 'react'
import Trading from '../trading/Trading'
import Archive from '../archive/Archive'
import './page.css';
export const DataBuyContext = React.createContext({})
const Page = () => {
const [dataBuy, setDataBuy] = useState([{}])
// let saveBuyData = (buyData) => {
// setBuyData(buyData)
// }
const [toggleState, setToggleState] = useState(1)
const toggleTab = (index) =>{
setToggleState(index);
}
console.log(dataBuy)
return (
<DataBuyContext.Provider value = {{dataBuy, setDataBuy}}>
<div className="container">
<div className="block-tabs">
<button
className={toggleState === 1 ? "tabs active-tabs" : "tabs"}
onClick={() => toggleTab(1)}>
Trading
</button>
<button
className={toggleState === 2 ? "tabs active-tabs" : "tabs"}
onClick={() => toggleTab(2)}>
Archive
</button>
</div>
<div className="content-tabs">
<div
className={toggleState === 1 ? "content active-content" : "content"}>
<Trading />
</div>
<div
className={toggleState === 2 ? "content active-content" : "content"}>
<Archive dataBuy= {dataBuy} />
</div>
</div>
</div>
</DataBuyContext.Provider>
);
}
export default Page;
Ответы (1 шт):
Автор решения: ksa
→ Ссылка
Давай начнем с работающего варианта. Можешь взять его за основу и развить html элементы до своего варианта.
//import React from 'react';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
const UserContext = React.createContext();
//
function App() {
const [user, setUser] = React.useState([])
return (
<UserContext.Provider value={{user, setUser}}>
<Add />
{user.map(el => <User key={el.id} data={el} />)}
</UserContext.Provider>
)
}
//
function User({data}) {
return <p>{data.name}</p>
}
//
function Add() {
const [val, setVal] = React.useState('')
const {setUser} = React.useContext(UserContext);
const add = _ => {
const o = {id: new Date(), name: val}
setUser(old => [...old, o])
setVal('')
}
return (
<div>
<input value={val} onInput={e => setVal(e.target.value)} />
<button onClick={add}>+</button>
</div>
)
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.production.min.js"></script>
<div id='root'></div>