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

反应成分引起混乱

曾航
2023-03-14

我被一些行为弄糊涂了,不知道是否有人能帮忙。我有一个React组件,它根据通过道具传入的过滤器获取电影数据。使用控制台。日志我可以看到我的componentDidMount()只被调用一次,但是每次由于接收到不同的道具而重新呈现组件时,仅在componentDidMount()中设置的状态变量都会更改。我的代码很长,所以我不想全部发布,但如果需要,我可以发布。下面是引起我困惑的片段:

class MoviesList extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
                        filterList : [], filter: {}
        };
    }
    async componentDidMount() {
        console.log("shouldOnlyCallOnce");
        if( this.props.filter.on) {
            if (this.props.filter.type == "title"){
                try {
                    const url = "mycustomapi.com/api/"+this.props.filter.title;
                    const response = await fetch(url);
                    const jsonData = await response.json();
                    jsonData.sort((a, b) => a.title.localeCompare(b.title));
                    console.log("??");
                    this.setState({filterList: jsonData, filter: this.props.filter});
                }
                catch (error) {
                    console.error(error);
                }
            }

尽管如此。过滤器仅在整个组件中设置,每次重新加载我的组件时它都会更改。有人知道如果不多次记录控制台日志,这是怎么发生的吗?

共有2个答案

吕鸿轩
2023-03-14

当组件执行初始化渲染时,将触发组件。道具或状态更改后,ComponentdiUpdate将触发。请查看链接:反应生命周期示例

琴琪
2023-03-14

在我看来,唯一的解释是您正在修改这个组件之外的过滤器的内容。

考虑一下:

let filterA = { title: 'foo' }

let filterB = filterA
console.log(filterB.title) // Shows 'foo'

filterA.title = 'bar'
console.log(filterB.title) // Shows 'bar'

尽管我们从未在这里直接修改过filterB,但值发生了变化。这是因为filterA和filterB引用同一个对象,所以它们当然都会更改。

如果您在本例中将筛选器作为道具传递,然后在父级中修改筛选器,则子级中的筛选器也会发生更改。

作为旁注:您所做的被称为从道具派生状态,这意味着您正在使用道具来设置状态。这几乎从来都不是好的做法。https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html

 类似资料:
  • 问题内容: 我正在使用带有react的ES6 babel,现在对于较新版本的react,react DOM不再是它的一部分。我对以下代码的怀疑是,这是第一行吗?因为我无处需要React,但最后一行需要ReactDOM。 问题答案: 从版本开始,React 分为两个部分: React 和 ReactDOM。 您正在使用。因此,对您而言,在组件中绝对有意义。但是就React而言,尽管您不是直接使用Re

  • 在减少分区数量时,可以使用coalesce,这很好,因为它不会引起混乱,而且似乎可以立即工作(不需要额外的作业阶段)。 有时我想做相反的事情,但重新分区会导致混乱。我想几个月前,我实际上通过使用balanceSlack=1.0的CoalescedRDD实现了这一点-所以会发生的是,它会分割一个分区,从而得到所有分区都位于同一节点上的分区位置(如此小的网络IO)。 这种功能在Hadoop中是自动的,

  • 我这里有一个代码片段,基本上展示了Dan提到的想法,即提升react中的内容,以自然地提高性能并编写更简洁的代码。在InputField组件中,按钮总是呈现,这不是我想要的行为,它应该跳过呈现按钮组件。所以它应该做的是跳过渲染,因为按钮是inputfield的子道具,如果子道具没有改变,react将跳过渲染。 Dan解释的类似概念示例:“当颜色改变时,ColorPicker重新渲染。但它仍然有上次

  • 问题内容: 有没有办法将一个组件传递到另一个React组件?我想创建一个模型react组件,并传入另一个react组件以包含该内容。 编辑:这是一个reactJS codepen,说明了我正在尝试做的事情。http://codepen.io/aallbrig/pen/bEhjo 的HTML ReactJS 问题答案: 您可以用来渲染组件包含的任何子代:

  • 我在我的应用程序中使用Redux,在一个组件中,当商店发生变化时,我想滚动到一个特定的div标签。我让Redux部分工作,因此它触发componentDidUpdate()方法(我已经路由到此component视图)。据我所知,问题在于方法scrollIntoView()无法正常工作,因为componentDidUpdate()有一个默认行为,即滚动到顶部覆盖scrollIntoView()。为了

  • 我知道,这对你们中的许多人来说相当简单,但我想澄清这些疑问。乍一看,它看起来像是递归函数,或者像是调用父compareTo函数。 然而,在研究之后,我倾向于认为这两种比较方法是不同的。实际被重写的第一个来自可比较的接口,第二个来自String类。因此,我们可以从String类调用compareTo,同时重写Comparable compareTo方法。 请证实我的想法。谢谢你。