【问题标题】:convert a class component to hooks and pass methods to child component将类组件转换为钩子并将方法传递给子组件
【发布时间】:2020-09-17 13:59:48
【问题描述】:

我正在尝试将下面的class component 转换为function component with hooks,但到目前为止我没有成功。

我在页面上看不到任何错误,也看不到页面上的终端,但我的目标是在页面上看到表单,但目前没有显示表单。

类组件

# PARENT

import React, { Component } from 'react';
import PersonalInfo from './PersonalInfo';
import AllInfo from './AllInfo';

class Main extends Component {
    state = {
        step: 1,

        firstName: '',
        lastName: '',

    }

    handleChange = input => e => {
        this.setState({[input]: e.target.value});
    }

    showSteps = () => {
        const {step, firstName, lastName } = this.state;

        if(step === 1)
            return (
                <PersonalInfo
                        handleChange = {this.handleChange}
                        nextStep = {this.nextStep}
                        firstName = {firstName}
                        lastName = {lastName}
                />);
        if(step === 3)
            return (
                <AllInfo
                        firstName = {firstName}
                lastName = {lastName}
    }


    render() {
        const {step} = this.state;
        return(
            <>
                <h2>Step {step} of 3.</h2>
                {this.showSteps()}
            </>
        );
    }
}

export default Main;



# CHILD

import React, { Component } from 'react';

class PersonalInfo extends Component {
    render() {
        const { handleChange, firstName, lastName } = this.props;

        return (
            <div>
                <h2>Enter your personal information</h2>
                <label>
                    <input
                        type="text"
                        name="firstName"
                        placeholder="First name"
                        value = {firstName}
                        onChange={handleChange('firstName')}
                    />
                </label>
                <label>
                    <input
                        type="text"
                        name="lastName"
                        placeholder="Last name"
                        value = {lastName}
                        onChange={handleChange('lastName')}
                    />
                </label>
            </div>
        );
    }
}

export default PersonalInfo;

功能组件

# PARENT

import React, { useState } from "react";
import PersonalInfo from './PersonalInfo';

type Props = {
  state: Object,
};

const MultiSteps = (props: Props) => {
  const [state, setState] = useState({
    step: 1,
    firstName: '',
  });

  const handleChange = (e) => {
    e.preventDefault();
    setState({...state, [input]: e.target.value});
  }

  const showSteps = () => {
    if (state && state.step === 1)
      return (
        <PersonalInfo
          handleChange = {handleChange}
          firstName = {state.firstName}
        />);

    if (state && state.step === 2)
      return (
        <AllInfo
          firstName = {state.firstName}
        />);
  }

  return(
        <>
        <h2>Step {state.step} of 3.</h2>
        Hello - {showSteps()}
        </>
  );
}

export default MultiSteps;



# CHILD

import React from "react";

const PersonalInfo = (props) => {

  return (
    <div>
      <h2>Enter personal information</h2>
      <label>
        <input
          type="text"
          name="firstName"
          placeholder="First name"
          value={props.firstName}
          onChange={handleChange('firstName')}
        />
      </label>
    </div>
  );
}

export default PersonalInfo;

目前页面和终端都没有错误,但我无法在页面上看到任何表单。

下方出现新错误

ReferenceError: handleChange is not defined

  12 |     placeholder: "First name" // value={firstName}
  13 |     ,
  14 |     value: "Lorenzo",
> 15 |     onChange: handleChange('firstName')
  16 |   })));
  17 | };
  18 | 

任何帮助都会非常有帮助!

【问题讨论】:

  • 这里的实际问题是什么?你有例外吗?
  • 你有[e.input]这可能是什么原因?
  • @mleister 我在页面上根本看不到表格。
  • @BhojendraRauniyar 我最近将该行编辑为[e.input],然后我再次将其删除。所以[input] 不是解决方案。我仍然看不到页面上的任何表单。
  • @mleister 我已经用当前的错误信息更新了帖子

标签: javascript reactjs react-native ecmascript-6 react-redux


【解决方案1】:

这里的问题是您在函数内部创建了一个名为 state 的新 const 值。

const { state } = props;

如果你只是从你的函数中删除这一行,“state”这个词现在将引用你通过 useState() 定义的 state const,而不是你新创建的 const,即引用 props.state(即未定义和导致无效的访问并使表单不显示)

然而,应该直接从组件中定义的状态变量(不是 props.state)访问步长值


旧答案,如果有人找到相同的消息,请保留

改变

if (state.step === 1) 

if(state && state.step == 1)

应该让错误信息停止。

发生错误是因为状态未定义并且您试图访问它的字段。在类示例中它不会发生,因为您使用对象析构函数来访问 step 值,因此它没有不安全的访问。

【讨论】:

  • 您的回答已解决,谢谢。你知道为什么我看不到页面上的表格吗?屏幕和终端都没有错误我可以看到页面上的所有其他内容,但我需要来自PersonalInfo 的表格
  • 你能检查 state 属性的值吗?只需在 showSteps 函数的第一个 if 语句之前放置一个 console.log(props.state)
  • 我想我明白了
  • 只需删除行 const { state } = props;
  • 从你的 showSteps 函数中删除该行,我会在答案中更好地解释它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 2020-11-06
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多