我正在构建一个React web应用程序,该应用程序分为多个组件,可通过React选项卡访问:
import React from 'react';
import ReactDOM from 'react-dom';
import { Tab, Tabs, TabList, TabPanel } from 'react-tabs';
import a from './components/a';
import b from './components/b';
const TabNavigator = () => (
<Tabs>
<TabList>
<Tab> A </Tab>
<Tab> B </Tab>
</TabList>
<TabPanel>
<a />
</TabPanel>
<TabPanel>
<b />
</TabPanel>
</Tabs>
);
ReactDOM.render(<TabNavigator />, document.getElementById('root'));
每个选项卡都是其自己的组件/子系统,在访问该选项卡时新呈现。在每个选项卡中,我都使用一个JSON文件的数据。此数据加载到每个组件的状态,如下所示:
constructor(props) {
super(props);
this.state = {
data: json
};
}
我现在正在更改其中一个组件中的状态,以触发使用新数据重新渲染:
this.setState({
data: editedJson
});
到目前为止还不错,但是当我现在切换到另一个选项卡/组件this.state.data
在那里也发生了变化-为什么会发生这种情况?组件之间是否共享状态?
编辑:这是一个MVCE,您可以在其中更改B中的状态,也可以在A中更改:
所有组件中的json都有相同的指针,所以所有组件都访问相同的对象并更改它。
要解决这个问题,您必须为每个组件创建全新的对象,如下所示:
this.state = {
data: { ...json }
};
我能够像这样复制你的问题:
import React from "react";
import ReactDOM from "react-dom";
import { Tab, Tabs, TabList, TabPanel } from "react-tabs";
import "./styles.css";
let json = { title: "I am a title" };
function Content({tab}) {
const [state, setState] = React.useState(json);
return (
<div>
<h1>{tab}</h1>
<h2>{state.title}</h2>
<label>New Title</label>
<input type="text" value={state.title} onChange={handleChange} />
</div>
);
function handleChange(e) {
json = { title: e.target.value };
setState(json);
}
}
function TabNavigator() {
return (
<Tabs>
<TabList>
<Tab>A</Tab>
<Tab>B</Tab>
</TabList>
<TabPanel><Content name="A" /></TabPanel>
<TabPanel><Content name="B"/></TabPanel>
</Tabs>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<TabNavigator />, rootElement);
当您更新“全局”对象json
,然后使用它更新组件
状态时,就会出现问题。请参见handleChange
功能;我首先更新json
对象,然后用它设置新组件state
。
当您切换到另一个选项卡
时,将创建一个新组件,该组件将从“全局”json
对象实例化其状态,因此,该组件将与另一个选项卡
具有相同的内容。在它们之间切换时,此过程会重复。
如果您删除此分配以更新状态
,则问题已得到解决(只需执行设置状态({title:e.target.value}
)。但您无法保留更改。若要解决此问题,我建议使用React上下文。这里是一个指向CodeSandbox的链接,您可以在其中看到它的操作。
我希望有帮助。
似乎当您导入该JSON文件时,您正在创建一个内存版本的JSON文件,然后这两个组件都在引用该文件。如果您按照@Christiaan在构造函数中的建议复制值(排列),那么您可以避免对原始值进行变异,这是一种糟糕的做法。
实际上有几个因素对你不利。首先是导入被缓存的事实(在这里解释),所以每次挂载选项卡时,json导入都会返回缓存的引用,该引用存储在data
中,并且在构造函数中,您将该引用值保存到state.data
.第二个是setState函数不是一个纯粹的函数。它只是再次复制引用,并在您真正想要创建新数组时改变它指向的数组,并在添加新元素之前浅复制所有元素。下面是另一个沙盒,应该有助于说明这一点。
一个普通的层中的第一个参数也是,是该层中神经元/节点的数量。然而,标准的LSTM单元如下所示: (这是《了解LSTM网络》的返工版) 在Keras中,当我创建这样的LSTM对象时,,我是否真的创建了这些LSTM单元的?还是LSTM单元内“神经网络”层的大小,即公式中的?还是别的什么? 对于上下文,我正在基于这个示例代码工作。 以下是留档:https://keras.io/layers/recurr
对于删除记录,我执行如下操作 Kafka如何知道记录被删除,在恢复过程中,它将从源主题转储记录(考虑源主题有一条键为-1的记录) 在我的拓扑中 null null 在状态存储中更新相同内容 我只想知道,在恢复过程中,该记录将被删除,这意味着如果使用键进行get on store时,我将得到null。
我在Google云存储上创建了一个bucket:。我为桶设置选择了“美国”多区域。 我的假设是,存储在这个bucket中的任何对象都将被复制到所有区域,以达到高耐久性的目的,但不会被推出到所有Google Cloud CDN全局边缘位置,以达到CDN的目的。 还是我的“美国”多区域桶中的所有对象都已经自动推出到所有谷歌云CDN边缘位置? 我大吃一惊,我不知道我的桶是否已经是一个CDN或不是。即使搜
我已经设置了AWS EC2实例,它正在运行。当我尝试从本地框ping时,它不可用。我找到的解决方案似乎都不起作用。我在安全组中添加了一条规则: 我已经完全禁用了Windows防火墙(仅用于测试)。我仍然无法 ping 此实例。
愣了好一会,陈董才很美国式地摊摊手说:“其实今天我是带了条件来的,之前我们已经开了董事会,给出了一个我认为非常优厚的条件,但既然你第一句话就这么说了,我觉得后面的都没意义了。” 绝影笑一笑:“我不知道是什么条件,当然现在告诉我也没什么意义。我只是想做一件我想做的事情。陈董,希望你能理解我。三年了,说心里话,只要我在公司,有什么事情我总是先想到公司。这次,我想为我自己想想,做一件我想做的事。” 陈董
问题内容: 我该怎么做: 在全球范围内,就像在主应用程序或功能中一样,是否有任何iFrame,img src等都可以使用? Docs在解释这一点方面很差。 问题答案: 我只是阅读了您先前回答中的评论。不知道您是否找到解决方案。似乎您在寻找事物的白名单类型。最近,我发现$ sce有一个白名单功能。 摘自AngularJS文档中的$ sceDelegateProvider : 有了这个,您可以像这样在