Реакция - повторная визуализация компонента при нажатии кнопки, которая находится за пределами компонента - PullRequest
1 голос
/ 22 февраля 2020

У меня есть index.js файл, в котором я рендерил компонент App.

Index. js file

ReactDOM.render(<App />, document.getElementById('root'));

Ниже приведен код для SettingContainer. js файл, где у меня есть SettingContainer компонент. У меня есть кнопка, при нажатии на которую мне нужно перерисовать <SettingContainer value="10" />, но она не рендерится с defaultvalues.

SettingContainer. js file:

import React from 'react';

const SettingContainer = (props) => {
    const [state, setState] = React.useState({
        currentValue: props.value
    });

    const handleChange = (event) => {
        setState({ currentValue: event.target.value });
    };

    return (
        <React.Fragment>
            <input type='text' value={state.currentValue} onChange={handleChange} />
        </React.Fragment>
    )

};

export default SettingContainer;

Ниже код для файла App.js, где у меня есть компонент App.

Приложение. js файл

const handleClick = () => {
  ReactDOM.render(<SettingContainer value="10" />, document.getElementById('divHello'));
};

const App = () => {
  return (
    <>
      <div id="divHello">
        <SettingContainer value="10" />
      </div>
      <button onClick={handleClick}>Button</button>
    </>
  );
};

export default App;

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

На самом деле, ваша проблема возвращается к вашему мышлению, вы должны изменить свое мнение о ReactJS. у вас должен быть контейнер Index, как показано ниже:

const Index = () => {
  const [isRender, renderSettingContainer] = useState(false);

  return (
    <>
      {isRender && (
        <SettingContainer />
      )}
      <App onClick={renderSettingContainer}>
    </>;
  );
};

Затем передайте функцию onClick из реквизита в приложение, как показано ниже:

const App = ({ onClick }) => (
  <>
    Hello Friends
    <div id="divHello">

    </div>
    <button onClick={onClick}>Button</button>
    </>
  );

Кроме того, нет Нужно использовать ReactDOM дважды, поэтому напишите это как показано ниже:

ReactDOM.render(<Index />, document.getElementById('root'));

Если у вас есть какие-либо вопросы, напишите комментарий, обязательно я отвечу и изменит свой ответ.

Подсказка : <></> похож на <React.Fragment></React.Fragment> с меньшим количеством кода и лучшей производительностью, основываясь на идее Дана Абрамова.

1 голос
/ 22 февраля 2020

Использование условного рендеринга, при нажатии кнопки установите значение для отображения компонента Hello.

const Hello = () => (<p>Hello</p>)

Затем в приложении установите значение true при нажатии кнопки.

const App = () => {

  const [displayHello, setDisplayHello] = useState(false);

  const handleClick = () => {
    setDisplayHello(!displayHello)
  };

  return (
    <React.Fragment>
     Hello Friends
    <div id="divHello">

    </div>
    {displayHello && <Hello />}
    <button onClick={handleClick}>Button</button>
   </React.Fragment>
 );
};

// Get a hook function
const {useState} = React;

const Hello = () => (<p style={{ backgroundColor: 'green', color: 'white'}}>Hi from Hello Component</p>)

const App = () => {

    const [displayHello, setDisplayHello] = useState(false);
  
    const handleClick = () => {
      setDisplayHello(!displayHello)
    };
  
    return (
      <React.Fragment>
       Hello Friends
      <div id="divHello">
  
      </div>
      {displayHello && <Hello />}
      <button onClick={handleClick}>Button</button>
     </React.Fragment>
   );
  };


// Render it
ReactDOM.render(
  <App />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...