【问题标题】:Changing State of a Component by Input from children通过子项的输入更改组件的状态
【发布时间】:2021-04-29 00:11:04
【问题描述】:

我有三种形式 - 登录、忘记密码和注册。初始渲染用于登录组件,该组件具有忘记密码或注册按钮。单击时,按钮会呈现它们各自的组件。

我现在的状态是,我为每个要渲染的子组件分配了状态,并且按钮更改了父组件中的状态。我想将这些按钮移动到子组件,以便我可以从那里更改状态

下面是登录页面和我提到的三个组件中的两个。

export default function SigninPage() {
  const [comp, setView] = useState('signin')
  function toggleSignin(comp){
    setView('signin')
  }
  function toggleReset(comp){
    setView('reset')
  }
  function toggleSignup(comp){
    setView('signup')
  }
  return (
    <LoginStyles>
      {comp ==='signin' &&(
        <div>
          <SignIn />
        </div>
        )
      }
      {comp ==='reset' &&(
        <div><RequestReset/></div>
        )
      }
      {comp ==='signup' &&(
        <div><SignUp/></div>
        )
      }
      <button onClick={toggleSignin}>Sign In</button>
      <button onClick={toggleReset}>Forgot Password</button>
      <button onClick={toggleSignup}>Sign Up</button>

    </div>
  );
}
export default function SignIn() {
  return (
    <Form>
      <h2>Sign Into Your Account</h2>
      <button type="submit">Sign In</button>
      {/* onClick sets state to 'signup'*/}
      <a>Create a New Account</a>
      <a>Forgot Password</a>
    </Form>
  );
}
export default function RequestReset() {
  return (
    <Form    >
      {/* onClick sets state to 'signin'*/}
      <a href='/signin'>**Go back**</a>
      <h2>Request a Password Reset</h2>
      <fieldset>
        <label htmlFor='email'>
          Email
        </label>
        <button type='submit'>Request Reset</button>
      </fieldset>
    </Form>
  )
}

【问题讨论】:

    标签: javascript reactjs use-state


    【解决方案1】:

    首先,我相信您应该使用路由来实现这种行为,您使用的这种方法绝对是混乱且难以遵循的。 话虽如此,我认为以下方法可以解决问题:

    <LoginStyles>
      {items.map(({ id, component, isVisible }) => (
         const Component = component;
         <div key={id} hidden={!isVisible}>
           <Component onClickComponent={() => handleClick(id)}
         </div>
       ))}
    </LoginStyles>
    

    当然,您需要稍后在孩子中调用 onClickComponent,但您将拥有范围并保留 id。

    【讨论】:

    • 是的,路由这些表单可以解决这个问题,但我想通过它们的状态来控制它们。我确实尝试了您的建议,但不幸的是无法使其发挥作用。
    • 我改变了我的方法(并编辑了问题)。我得到了我想要的结果,但仍然不确定如何将按钮功能移动到子组件。
    • 没关系,我只是将按钮移动到带有子组件的 div 中,它就可以工作了
    • 休息了几天,我刚刚制作了这个codesandox,我相信这就是你想要的。真的不知道在哪里放置按钮以显示重置组件,但它很容易理解,所以你会弄清楚。 codesandbox.io/s/cranky-chatelet-fu4s8
    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2019-06-28
    • 2021-06-20
    • 1970-01-01
    • 2020-06-06
    • 2020-01-13
    • 1970-01-01
    相关资源
    最近更新 更多