@Kryptonit

Можно ли получить значение из дочернего компонента через ref?

Здравствуйте, у меня возник неординарный вопрос, безусловно можно сделать то, что я хочу другим более простым и релевантным способом, а именно: у меня есть 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 в дочернем компоненте изменяется, а в родительском нет, с чем это может быть связано?
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы