- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 redux thunk 返回对操作的 API 调用:
export const getActiveCampaigns = () => {
return (dispatch, getState) => {
const bearer = 'Bearer ' + getState().login.bearer
return axios.get(API.path + 'campaign/active/?website_id=' + getState().selectedWebsite.selectedWebsite + '&' + API.beaconAPI_client, { headers: { 'Authorization': bearer } })
.then(function (response) {
dispatch({
type: GET_ACTIVE_CAMPAIGNS,
activeCampaigns: response.data.response
})
})
}
}
这成功地返回了一个营销事件列表,我使用以下方法将其渲染到另一个组件中:
class ActiveCampaignsDropdown extends Component {
// usual stuff
componentDidMount(){
this.props.dispatch(getActiveCampaigns())
}
// render function displays campaigns using this.props.activeCampaigns
}
const mapStateToProps = (state) => {
return {
activeCampaigns: state.activeCampaigns.activeCampaigns
}
}
但是,请注意该操作的 getState.selectedWebsite.selectedWebsite
。这是通过应用程序中其他位置的操作设置的,用户可以从下拉列表中选择一个网站。我的 reducer 如下所示:
export default function (state = {}, action) {
switch(action.type){
case SET_SELECTED_WEBSITE:
return {
...state,
selectedWebsite: action.websiteId
}
default:
return state;
}
}
export default function (state = {}, action) {
switch(action.type){
case GET_ACTIVE_CAMPAIGNS:
return {
...state,
activeCampaigns: action.activeCampaigns
}
default:
return state;
}
}
我设置所选网站的操作:
export const setSelectedWebsite = (websiteId) => {
return {
type: SET_SELECTED_WEBSITE,
websiteId
}
}
这与其他 reducer 相结合,如下所示:
export default combineReducers({
login,
activeWebsites,
activeCampaigns,
selectedWebsite
})
问题
事件事件下拉框的内容在页面加载时工作正常 - 并且状态树确实更新 - 但当所选网站发生更改时它不会更新。据我所知:
我对 Redux 在这种情况下不能“正常工作”感到非常失望,尽管我可能因为只睡了几个小时而忽略了一些愚蠢的事情!任何帮助表示赞赏。
最佳答案
在 React 中,当发生以下三种情况之一时,组件就会更新:
根据您的情况,您希望更新 ActiveCampaignsDropdown
当state.activeCampaigns
商店的变化。为此,您必须连接组件,以便它接收此值作为 prop(从而在更改时强制更新)。
这可以按如下方式完成:
import {connect} from 'react-redux'
class ActiveCampaignsDropdown extends React.Component { ... }
const mapStateToProps = (state) => ({activeCampaigns: state.activeCampaigns});
const Container = connect(mapStateToProps)(ActiveCampaignsDropdown);
export default Container;
决赛Container
组件将完成连接 ActiveCampaignsDropdown
的所有工作通过其 props 获得所需的存储状态。
Redux 的 connect()
还允许我们连接调度函数来修改存储中的数据。例如:
// ... component declaration
// ... mapStateToProps
const mapDispatchToProps = (dispatch) =>
{
return {
getActiveCampaigns: () => dispatch(getActiveCampaigns())
};
}
const Container = connect(mapStateToProps, mapDispatchToProps)(ActiveCampaignsDropdown);
定义映射函数后,将创建容器组件并渲染容器,ActiveCampaignsDropdown
将正确连接。在我的示例中,它将接收“activeCampaigns”和“getActiveCampaigns”作为 Prop ,并在它们的值发生变化时进行相应更新。
编辑:
再次查看您的代码后,我认为您的问题是由于没有满足更新 ActiveCampaignsDropdown
的条件造成的。当网站发生变化时。通过调用getActiveCampaigns()
从您的 WebsiteDropdown (根据您的评论),这正在强制 state.activeCampaigns
更改,成功更新 ActiveCampaignsDropdown
。正如我的评论中提到的,“强制”不负责这样做的组件进行此更改将被视为不好的做法。
一个完全合理的解决方案是 ActiveCampaignsDropdown
“监听”当前网站的更改并相应地进行 self 更新。为此,您需要做两件事:
(1) 将网站状态映射到组件
const mapStateToProps = (state) => {
return {
activeCampaigns: state.activeCampaigns.activeCampaigns, // unsure why structured like this
selectedWebsite: state.selectedWebsite.selectedWebsite
}
}
(2) 将您的调度调用移至 componentWillReceiveProps
class ActiveCampaignsDropdown extends React.Component
{
// ...
componentWillReceiveProps(nextProps)
{
if (this.props.selectedWebsite !== nextProps.selectedWebsite)
{
this.props.getActiveCampaigns();
}
}
}
现在,每次选定的网站发生更改时,都会发生刷新,并且 componentWillReceiveProps()
将被调用(导致 activeCampaigns
也更新)。应用此更新后,将发生另一次刷新,并且呈现的下拉列表将包含新更新的广告系列。
一些小的改进:
如果您的许多组件依赖于当前网站的状态(我想有很多),那么您可以考虑通过 context
向它们提供它.
现在你的ActiveCampaignsDropdown
接收 'selectedWebsite' 作为 prop,您可以将其直接传递给您的操作函数,而不是让它从状态中获取它(使用 getState()
) - 顺便说一下,如果可能的话,也应该避免这种情况。
关于reactjs - 修改 redux 存储时组件不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49064590/
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!