- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的组件状态保存的数据(片段)看起来像这样:
[
{
batchId: 1234,
...
jobRowData: [
{
assignmentId: 12345,
isSelected: false,
...
},
{
assignmentId: 12346,
isSelected: false,
...
}
]
},
{
batchId: 1235,
...
jobRowData: [
{
assignmentId: 12347,
isSelected: false,
...
},
{
assignmentId: 12348,
isSelected: false,
...
}
]
}
]
我想更改 isSelected 并使用以下方法进行更改:
handleIsSelectedChangedJob(selectedIdsData){
let jobRowData = this.state.batchRowData.find((x) => {return x.batchId === selectedIdsData.batchId}).jobRowData
let jobRowItemData = jobRowData.find((x) => {return x.assignmentId === selectedIdsData.assignmentId})
jobRowItemData.isSelected = !jobRowItemData.isSelected // do the update
// this.setState({batchRowData: [...this.state.batchRowData]}) // this also works instead of this.forceUpdate()
this.forceUpdate() // how to refresh view according to update 2 lines above ?
}
参数 selectedIdsData 可能看起来像这样:
{assignmentId: 12346, batchId: 1234}
我的问题是:除了执行 this.forceUpdate() 之外,还有其他刷新 View 的方法吗?它上面的注释行也可以完成这项工作,但它对整个状态对象而不是一个更改的属性进行操作。
最佳答案
当然!您永远不应该直接修改状态(通过引用),这正是 handleIsSelectedChangedJob
内部发生的事情。您必须创建一个新状态并调用 setState
:
handleIsSelectedChangedJob({assignmentId, batchId}) {
const dataIndex = this.state.batchRowData.findIndex(x => x.batchId === batchId);
const data = this.state.batchRowData[dataIndex];
const itemIndex = data.jobRowData.findIndex(x => x.assignmentId === assignmentId);
const item = data.jobRowData[itemIndex];
const newItem = {...item, isSelected: !item.isSelected};
const newData = {
...data,
jobRowData: [].concat(
data.jobRowData.slice(0, itemIndex),
newItem,
data.jobRowData.slice(1 + itemIndex)
)
};
this.setState({
batchRowData: [].concat(
batchRowData.slice(0, dataIndex),
newData,
batchRowData.slice(1 + dataIndex)
)
});
}
如您所见,它的代码要多得多,但现在它不会改变状态,只会根据需要复制。当然,有很多图书馆可以做到这一点。它仍然不完美,因为读取 this.state
然后调用 this.setState
并不好——使用 this.state(state => diff)
会更安全:
handleIsSelectedChangedJob({assignmentId, batchId}) {
this.setState(state => {
const dataIndex = state.batchRowData.findIndex(x => x.batchId === batchId);
const data = state.batchRowData[dataIndex];
// Same as above...
return {
batchRowData: [].concat(
batchRowData.slice(0, dataIndex),
newData,
batchRowData.slice(1 + dataIndex)
)
};
});
}
关于javascript - 有没有比 forceUpdate() 更好的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56805345/
假设已经定义了所有不同的组件。 在我的 React 组件中,我希望单击按钮触发附加一个新的 TextBox我动态创建的组件 questions成分。当我用 forceUpdate() 测试按钮点击时,
文档对 forceUpdate 的描述如下: Calling forceUpdate() will cause render() to be called on the component, skip
我有以下组件,其中将显示产品列表。 CounterComponent 添加到两个位置,一个在 ProductCatalog 中,另一个在 ProductCard 中,可以在模态中显示。在柜台表示订购的
以非常简单的react.js应用程序为例I created here .. data = note: "" setNote = -> data.note = $('inpu
在 React docs , forceUpdate有一个参数callback . 是不是像 setState设置状态后调用的第二个参数?或者那是为了什么? 我找不到任何关于它的文章。 最佳答案 Is
我可以强制重装对于具有 this.forceUpdate() 的父组件,但是如何为子组件做呢? 即以下 react 类方法: buttonClick = () => { //This updat
我的组件状态保存的数据(片段)看起来像这样: [ { batchId: 1234, ... jobRowData: [
我在整个应用程序的多个组件中使用以下模式。我注意到许多人不鼓励使用 forceUpdate(),有些人甚至称其为 hack。那么如何在不使用它的情况下完成呢? // user.js export de
迫使 Vue 实例重新渲染。注意它仅仅影响实例本身和插入插槽内容的子组件,而不是所有子组件。 比如v-for里面数据层次太多, 修改过数据变了,页面没有重新渲染,需手动强制刷新。
我在控制台中看到这个错误并尝试了很多解决方案都没有用 ExceptionsManager.js:84 Warning: Can't call setState (or forceUpdate) on
我想在用户单击主页按钮时刷新整个页面。我正在使用 thisHOME 它按预期工作,但我有这个错误。知道我为什么得到它吗? Cannot read property 'enqueueForceUpdat
我有一个问题,redux 状态被成功更新,但 react 组件没有重新渲染,经过一些研究我相信 [forceUpdate()][1] 可以解决我的问题,但我是不确定实现它的正确方法,即在 redux
我有这个组件,我想在我的 api 调用后重新呈现。我无法弄清楚为什么在 getWinks 的 api 调用之后,winks-count 确实更新但不在 View 上,除非我刷新。我不应该使用 this
我这周开始学习 VueJS,我正在尝试构建一个笔记应用程序,但遇到了一些问题: NOTES :
我有一个简单的 React 设置,看起来有点像这样: index.js ReactDOM.render(, document.getElementById('root')); App.js expor
Gutentag,伙计们! 卸载组件后,我的应用程序不断收到此错误消息: Warning: Can't call setState (or forceUpdate) on an unmounted c
React 文档说 永远不要直接改变 this.state,因为之后调用 setState() 可能会替换你所做的改变。将 this.state 视为不可变的... 但当我根本不使用 setState
我不确定我这样做是对还是错,但我似乎找到了如何为计算值更新 dom 的所有答案...... 我有这个组件: Vue.component('bpmn-groups', { props: ['gr
当 observable 更新时,Mobx @observer 组件会触发该组件上的 render 或 forceUpdate 吗?当它发生时会触发哪些生命周期方法? render 和 forceUp
我正在 componentDidMount 中获取数据并更新状态,并且出现了著名的警告: Warning: Can't call setState (or forceUpdate) on an unm
我是一名优秀的程序员,十分优秀!