当前位置: 首页 > 知识库问答 >
问题:

React.js如何正确实例化父类中的子组件

董桐
2023-03-14

我对反应很陌生。js和我一直在研究一个组件类(子类),该类具有函数和单个状态对象,我的最终目标是在父类中使用该类,以便它可以调用其函数并更新状态。

我遇到的问题是:

  1. 我不知道组件的生命周期,并且
  2. 我有着深厚的文化背景

意思:我一直像对待任何C#类而不是JavaScript一样对待这些组件类。我现在知道了。

但我需要帮助评估我的方法并解决我一直看到的这个问题:

这是我的子类组件

从“React”导入React,{Component};从“axios”导入axios;

export default class ClassB extends Component {
    constructor() {
        super();

        console.log("ClassB constructor got called");

        this.state = {
            users: [{ name: '', email: '' }]
        };
    }

    getUsers() {
        let URL = "https://localhost:5001/api/FooController/FooAction"
        let myParam = 100;

        axios.get(URL,
            {
                params: { myParam }
            })
            .then(response => {
                // handle logic here...

            }).catch(function (error) {
                console.log('What happened? ' + error.response.data);
            });
    }

    addUserData(name, email) {
        this.setState(this.state, { users: [name, email] });
    }

    componentDidMount() {
        console.log("ClassB componentDidMount got called");     
    }

    render() {
        console.log("ClassB render got called");
        return ( null )
    }
}

在我的父类(Home.js)中,我实例化了子类(ClassB.js)并使用其实例:

import React, { Component } from 'react';
import ClassB from './ClassB'
import ClassC from './ClassC'

const classBComponent = new ClassB();

export class Home extends Component {
    static displayName = Home.name;
    

    constructor() {
        super();

    }

    componentDidMount() {
        this.timerID = setInterval(() => {
            classBComponent.getUserValues();
        }, 3000);
    }

    componentWillUnmount() {
        clearInterval(this.timerID);
    }

    render() {

        myComponent.render();

        return (
            <div className="container">
                <h1>My Other Component:</h1>
                <div className="row">
                    <div className="col-sm">
                        <ClassC name={[{ component: classBComponent, info: ['John', 'john123@123.com'] }]} />
                    </div>
                </div>
            </div>
        );
    }
}

在这个父类中,我打算从ClassB组件中调用“getUserValues()方法。我还有另一个子组件(ClassC),它是一个功能组件,我想传递实例化的ClassB组件,以便它也可以访问其函数和状态。但是,在ClassC组件中,当我调用“addUserData()”方法时,它给出了我在上面粘贴的错误(见图)。

下面是我如何设置ClassC的:

import React, { useEffect } from 'react';
import axios from 'axios';

const ClassC = (props) => {

    // variables
    let user  = props.name[0].info[0];
    let email = props.name[0].info[1];

    // component
    const component = props.name[0].component;


    // renders component
    function componentMount() {
        component.addSimModelNodeInfo(user, email);
    }

    // leaves the component
    function componentUnmount() {       

    }

    useEffect(() => {
        componentMount();
        return () => {
            componentUnmount();
        }
    }, [])

    return (
        <div className="card shadow-sm p-3 mb-5 bg-white rounded">
            <div className="card-header">
                <h5>{name}</h5>
                <h5>{email}</h5>
            </div>          
        </div>
    );
}

export default ClassC;

我之前提到过,我对组件的生命周期没有很好的把握。我放了那些控制台。登录ClassB只是为了意识到唯一被调用的方法是构造函数。componentDidMount()函数从未被调用,render()也从未被调用。为什么?我知道它与那个错误有关,这就是为什么我的ClassB组件从来没有“挂载”过。我做错了什么?非常感谢。

共有1个答案

夹谷星纬
2023-03-14

下面是从子组件调用父组件函数的示例。为了简洁起见,我使用了函数组件,但这在基于类的情况下也是完全可能的。

如果你不熟悉功能组件,你可以考虑像这样的道具。props,函数本身类似于类组件中的render()方法。还有更多内容,但对于这个小例子,如果你需要翻译,它应该会帮助你。

const ChildComponent = (props) => <button onClick={props.onClick} />

const ParentComponent = () => {
  const onClick = () => {
    console.log("Click Clack");
  }
  return <ChildComponent onClick={onClick} />;
};
 类似资料:
  • 我有java中的类:。和类,它扩展了类。 Class保留Class的实例。 我注意到,当我调用类B的构造函数时(当我在类A中初始化这个参数时),它会执行super(),创建一个新的实例A,并初始化所有It字段。 我如何告诉class

  • 问题内容: 我看到了无数的示例和教程,这些示例和教程展示了如何通过仅设置文件的权限位来创建文件,并且所有这些文件都“作弊”。我想知道/找出如何在创建/更新文件期间正确实例化os.FileMode以提供给编写者。 下面是一个简单的示例: 在上面的基本功能中,权限位0664被设置,尽管这有时可能有意义,但我还是希望有一种正确设置文件模式的正确方法。从上面可以看到,一个常见的示例是UID / GID是已

  • 本文向大家介绍如何在子组件中访问父组件的实例?相关面试题,主要包含被问及如何在子组件中访问父组件的实例?时的应答技巧和注意事项,需要的朋友参考一下 vue中如果父组件想调用子组件的方法,可以在子组件中加上ref,然后通过this.$refs.ref.method调用(https://www.cnblogs.com/jin-zhe/p/9523029.html) Vue中子组件调用父组件的方法,这里

  • 我有一个父组件[MainLayout],它有一个子组件[ListItems],并且有多个子组件[ListItem]。 谢谢你的回答!

  • 如何在Children内部拿到父级的ref? 父级是不同的组件

  • 我正在使用一个简单的Java命令行,需要将log4j插入到我的应用程序中,因此我遵循本教程: http://veerasundar.com/blog/2009/07/log4j-tutorial-adding-log4j-logging-to-your-project/ 因此,我完成了以下步骤: > 我将log4jjar文件放入我的项目库中。 我把log4j放进去了。属性转换为配置包,我使用以下最