Здравствуйте, у меня возник неординарный вопрос, безусловно можно сделать то, что я хочу другим более простым и релевантным способом, а именно: у меня есть App компонент, в котором есть кнопка и AutoComplete элемент из Material UI,
После того как я ввёл в него значение я нажимаю кнопку и это значением записывается в родительский ref и впоследствии как-то обрабатывается, кнопка и AutoComplete находятся на одном уровне, самое простое, как можно это сделать: спустить вниз функцию, изменяющую родительский state, но хочется расставить все точки над i и понять, возможно ли это реализовать через ref, приведу код:
App:
import React from 'react';
import {AutoComplete} from './components/AutoComplete';
import BasicList from './components/List';
import Button from '@mui/material/Button';
function App() {
const [ INNs, setINNs ] = React.useState(initialINN)
const ref = React.useRef(null)
const removeInn = ( inn ) => {
const newInns = INNs.filter( innCur => innCur !== inn)
setINNs(newInns)
}
const addInn = ( inn ) => {
setINNs( [...INNs, inn])
}
console.log(ref)
React.useEffect(() => {
console.log(ref)
}, [ ref])
return (
<main className='flex w-100 h-100 justify-between py-2'>
<div className='search flex'>
<AutoComplete INNs={INNs} ref={ref} />
<Button variant="contained" sx={{
maxHeight: 30,
marginLeft: 3
}}>Add</Button>
</div>
<BasicList INNs={INNs} />
</main>
);
}
const initialINN = [
175601765422,
175601765422,
212279937981,
]
export default App;
AutoComplete:
import React from 'react';
import Autocomplete from '@mui/material/Autocomplete';
import TextField from '@mui/material/TextField';
const representInn = ( arr ) => {
const obj = []
arr.forEach( (inn, id) => {obj.push({label: inn.toString(), id})});
return obj
}
export const AutoComplete = React.forwardRef( ( {INNs, ...props}, ref ) => {
const [ value, setValue ] = React.useState('')
const [ inputValue, setInputValue ] = React.useState('')
React.useEffect(() => {
ref.current = inputValue
}, [value, inputValue])
const [ ins, setInns ] = React.useState(representInn(INNs))
return (
<Autocomplete
inputValue={inputValue}
value={value}
onChange={(e, newValue) => { setValue(newValue) }}
onInputChange={(event, newInputValue) => {
setInputValue(newInputValue);
}}
disablePortal
id="combo-box-demo"
options={ins}
sx={{ width: 300 }}
isOptionEqualToValue={(option, value) => {
return option.id === value.id
}}
renderOption={(props, option) => {
return <li
{...props}
key={option.id}
>{option.label}</li>
} }
renderInput={(params) => <TextField {...params} label="Movie" />}
/>
)
})
Самое интересное для меня то, что значение ref.current в дочернем компоненте изменяется, а в родительском нет, с чем это может быть связано?