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

ComponentDidMount看不到家长的道具

阎裕
2023-03-14

我是新来的反应,我又被卡住了。我试图映射我的数组,以在我的子组件中创建新的对象数组。这是我的问题——我的方法组件迪迪蒙特在数据来自父母道具之前被执行,我的状态保持为空。当我console.logingthis.props和组件的末尾,我收到空数组,但当我console.loging渲染方法它给我4个空数组,然后它填充到预期的300。我做错了什么?

父组件:

import "./App.css";
import { CompanyList } from "./components/companylist/companylist.component";
import { Searchfield } from "./components/searchfield/searchfield.component";

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            companies: [],
            searchfield: "",
        };
    }

    componentDidMount = () => {
        const URL = "https://xxxxx/companies";
        fetch(URL)
            .then((response) => response.json())
            .then((data) => this.setState({ companies: data }))
            .catch((error) => {
                console.error("Error", error);
            });
    };

    render() {
        const filteredCompanies = this.state.companies.filter((item) =>
            item.name.toLowerCase().includes(this.state.searchfield.toLowerCase())
        );
        return (
            <div>
                <Searchfield
                    handleChange={(e) => this.setState({ searchfield: e.target.value })}
                />
                <CompanyList companies={filteredCompanies} />
            </div>
        );
    }
}

export default App;

儿童部分:

import React, { Component } from "react";
import { Company } from "../company/company.component";

export class CompanyList extends Component {
    constructor(props) {
        super(props);
        this.state = {
            newArray: [],
        };
    }

    componentDidMount = () => {
        const filledArray = this.props.companies.map((item) => {
            let result;
            fetch(`https://xxxxx/incomes/${item.id}`)
                .then((response) => response.json())
                .then((data) => {
                    let transactionsToFloat = data.incomes.map((item) =>
                        parseFloat(item.value)
                    );
                    result = transactionsToFloat.reduce((acc, num) => {
                        return acc + num;
                    }, 0);
                    result = Math.round(result * 100) / 100;
                });
            return {
                id: item.id,
                name: item.name,
                city: item.city,
                totalIncome: result,
            };
        });
        this.setState({ newArray: filledArray });
        console.log(this.props);
    };

    render() {
        console.log(this.props);
        return (
            <div>
                <table>
                    <thead>
                        <tr>
                            <th> Id </th>
                            <th> Name </th>
                            <th> City </th>
                            <th> Total income </th>
                        </tr>
                    </thead>

                    {this.props.companies.map((item) => (
                        <Company key={item.id} company={item} />
                    ))}
                </table>
            </div>
        );
    }
}

共有1个答案

韦星文
2023-03-14

componentWillMount()发生在render()之前。componentDidMount()在之后发生。

这是因为React从根本上是如何工作的。React应该让人感觉快速、流畅、敏捷。应用程序不应使用http请求或异步代码登录。答案是使用生命周期方法来控制DOM。

当组件挂载时意味着什么?

更好地理解一些React词汇可能会有所帮助。当一个组件被装入时,它被插入到DOM中。这是调用构造函数的时候。componentWillMount几乎与构造函数同义,并且几乎同时被调用。componentDidMount仅在第一次渲染后调用一次。

组件将安装--

 类似资料:
  • 我试图使用在child中的函数中生成的值。js并将其传递给父级。所以我可以使用这个值来过滤子数组。 小孩js 是生成的值,我需要在父级中访问该值。js Parent.js 我是不是错过了一些显而易见的东西?控制台。日志for返回子项的所有值。js节点,但当用作道具时返回未定义。 如何让函数运行,这样我就可以用返回的值过滤结果? 谢谢

  • 我不知道是否有问题,但我想知道为什么溢出:hidden在固定的父/子元素上不起作用。 举个例子: CSS和HTML: 现场演示:jsFiddle

  • 我试图将一个参数从父组件传递给子组件的ComponentDidMount()方法。我只能在子组件的render()中接收道具,而无法将其传递给ComponentDidMount()方法。 父组件-提供程序。js 子组件-AddCarePlan。js

  • 我有一个和道具同名的守望者。道具是在某个事件的父组件中动态设置的。我需要一些东西,每次在父组件上触发事件时,都会用属性值触发子组件中的某个函数,即使它设置的属性相同。是否有任何观察者选项或其他处理此类案件的方法允许我这样做? 我尝试了什么(这是在组件中): 仅在newVal与oldVal不同时打印,我需要一些函数来触发,即使它们相同。父组件如下所示: 这些是父数据和方法:

  • 问题内容: 我建立了一个新的react项目,由于某种原因,该方法没有被调用。 我已经通过调用in 验证了此行为,但是在控制台中看不到它的输出。 此外,无法正常工作。 关于为什么不调用,我感到很困惑。我尝试同时使用React“ v0.14.0”和“ v0.14.3”。 为什么不调用“ componentDidMount”? 码: 问题答案: 所以…瞧瞧......我终于开始工作了(在后端专家的帮助下

  • 当产品(和子产品)类别页面和商店页面中的条件标记(是产品类别)同时出现时,我无法应用下面的代码。 希望有人能帮忙。 我的目标:每个产品类别页面(包括家长) 参考代码片段和代码片段