React - 单击位于组件外部的按钮时重新渲染组件

Posted

技术标签:

【中文标题】React - 单击位于组件外部的按钮时重新渲染组件【英文标题】:React - Rerender component on click of button which resides outside of component 【发布时间】:2020-06-06 20:59:27 【问题描述】:

我有 index.js 文件,我在其中渲染了 App 组件。

Index.js 文件

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

下面是我有 SettingContainer 组件的 SettingContainer.js 文件的代码。我有一个点击它的按钮,我需要重新渲染&lt;SettingContainer value="10" /&gt; 但它不能用defaultvalues 渲染。

SettingContainer.js 文件:

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 组件。

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;

【问题讨论】:

你到底想完成什么? 我需要在单击该组件外部的按钮时使用 defaultValues 重新渲染 settingContainer.. 也许使用 Redux ? 不,亲爱的@DominikMatis,请不要,Redux 很好,但不适用于这种微小的情况。它可能有一个上限状态。 好吧,我不认为你应该分别渲染两个组件......都应该在App中 【参考方案1】:

其实,你的问题又回到你的心态上,你应该改变你对 ReactJS 的想法。你应该有一个Index 容器,如下所示:

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

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

然后,将 onClick 函数从 props 传递给 App,如下所示:

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

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

另外,ReactDOM 也不需要使用两次,所以写成如下:

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

如果您有任何问题,请写评论,肯定的,我会回答并会更改我的答案。

提示&lt;&gt;&lt;/&gt;&lt;React.Fragment&gt;&lt;/React.Fragment&gt; 一样,代码更少,性能更好,基于 Dan Abramov 的想法。

【讨论】:

【参考方案2】:

使用条件渲染,按下按钮设置值显示Hello组件。

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

然后在 App 中按下按钮时将值设置为 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>

【讨论】:

您的回答就像mine 使用更好的工具,我的意思是代码片段。我留下一个赞成票。谢谢。

以上是关于React - 单击位于组件外部的按钮时重新渲染组件的主要内容,如果未能解决你的问题,请参考以下文章

React 子组件在重新渲染时失去动画

React.memo()、useCallback()、useMemo() 区别及基本使用

React 组件不会在值更改时重新渲染并显示 CSS 更改

当状态改变时,React不会重新渲染我的组件

如何从外部函数渲染组件

API 调用后 React/Flux seState 不重新渲染组件