- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 4 个按钮的 ReactJS 菜单组件,它触发我页面的右侧,还有一堆过滤器在点击时重新加载。
render: function() {
return (
<div className="menu">
{
this.state.items.map(function(menuNode) {
return (
<MenuItem item={menuNode} onClick={this.handleClick} key={menuNode.name} />
);
}, this)
}
</div>
);
},
handleClick: function(selected) {
this.state.items.forEach(function(item) {
item.selected = false;
});
selected.selected = true;
this.setState({
items: this.state.items
});
resetReact.BoxStructure(selected);
resetReact.Filter(selected);
}
resetReact.BoxStructure()
和 resetReact.Filter()
触发 setProps()
/setState()
在我的页面 (BoxStructure) 和过滤器组件中添加了新内容。
它们在每个组件的 componentDidMount
中设置,如下所示:
var BoxStructure = React.createClass({
...
componentDidMount: function() {
if(this.props.callback)
this.props.callback();
resetReact.BoxStructure = function(selected) {
this.state.boxes = selected.content;
this.setProps({
color: selected.color,
callback: selected.callback,
key: selected.name
});
}.bind(this);
}
});
这行得通,但菜单感觉真的很慢,就像在更改所选菜单项之前等待整个页面加载一样。 BoxStructure 需要几秒钟的时间来加载,这很好并且是预期的,但我不希望菜单在更改所选项目之前等待它。从用户的 Angular 来看,当我点击按钮时,感觉就像什么都没有发生。
这可以通过添加 setTimeout
1ms 来解决:
handleClick: function(selected) {
this.state.items.forEach(function(item) {
item.selected = false;
});
selected.selected = true;
this.setState({
items: this.state.items
});
setTimeout(function() {
resetReact.BoxStructure(selected);
resetReact.Filter(selected);
}, 1);
}
现在菜单会立即更改,然后页面可能会根据需要呈现多长时间,这正是我想要的方式,但问题是为什么以及我是否做错了根本性的事情?我认为 setTimeout
强制重新加载是异步的,但我觉得这不是实现我想要的目标的正确方法,也许 ReactJS 在某处内置了更好的方法。
最佳答案
您应该努力使您的 BoxStructure
和 Filter
代码更高效。您可能想要分析它们、打印毫秒时间戳以及执行其他类似操作。
如果您知道这些调用会很慢,并且您想向用户反馈正在发生的事情,您可能希望延迟这些繁重的调用,直到之前的状态更新完成并呈现。
做到这一点的方法是使用 setState 的回调:
handleClick: function(selected) {
...
this.setState({
items: ...
}, function() {
resetReact.BoxStructure(selected);
resetReact.Filter(selected);
});
}
来自文档:
The second (optional) parameter is a callback function that will be executed once setState is completed and the component is re-rendered.
同样来自文档:
NEVER mutate this.state directly, as calling setState() afterwards may replace the mutation you made. Treat this.state as if it were immutable.
您通过改变 this.state 然后将其反馈给 setState() 来绕过一条细线。不要那样做。
作为替代方案,您可以在您的状态中存储单个 selectedItem
索引(0 到 之间的整数),而不是在每个项目中存储一个
- 1) 所以你只需要更新那个单一的变量。 selected
标志items.length
此外,为什么您的菜单项处于开头状态?是否允许用户更改它们?如果答案是否定的,那么您应该将它们放在 props 或类常量中。
关于javascript - 多个 setState 排队并导致一切都感觉很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29912622/
我已经能够创建一个 PHP-Imagick 脚本来生成像上面那样的图像。现在我想为这些圆圈添加渐变。下面是一个理想结果的示例。 我希望给这些圆圈一种三维的感觉。希望我能够控制这个径向渐变的 x 和 y
我非常喜欢首选项 UI 项的外观和感觉,并想在我的应用程序中复制它。基本上我有一个 Activity,其中有几个 LinearLayouts 设置为可聚焦。当他们集中注意力时,我希望他们变成绿色(就像
我喜欢 Android 首选项类别中的标题栏样式。 在我的 Activity(不是 PreferenceActivity)中如何使用相同的样式? 最佳答案 由于我刚刚花了最后几个小时试图回答这个老问题
希望没有人问过这个问题 - 没看到,但如果重复,我深表歉意。 无论如何,我正在使用 Eclipse RCP 构建一些插件,并将 SWT 用于我的 UI。我有一个包含一些面板和其他项目的 Composi
我目前正在学习 Haskell 和 Yampa,并且对 react 函数有疑问。 reactimate :: IO a -- init -> (Bool -> IO (DTime, May
我一直在尝试将视频的帧速率降低到每秒 10 或 15 帧。有一些4/5年前的OBJC相关问题。我在 swift 中找不到任何东西.. 这就是我在 Playground 上所做的工作: import C
是否有可能以某种方式改变 NetBeans 的外观/感觉?我知道它使用 Swing,并且通常将 Swing 用于其 UI 的应用程序通常可以更改其 UI 方案。 OSX 的默认外观是呕吐式的,甚至可以
我正在构建一个应用程序,它可以将少量 简单的 HTML(本地)加载到单个全屏 UIWebView 中。我注意到滚动此 Web View 感觉与滚动任何其他 UIScrollView 明显不同。从本质上
我正在尝试使用python探索Elasticsearch集群,而我是Elasticsearch的新手。如果使用Marvel / Sense,则可以使用GET _mapping查看集群的架构。在Pyth
我正在做一个简单的用户控制。例如: File path: SelectedFile 是我的 UserControl 公开的一个属性 (DependencyProper
好吧,我们正在运行一个非常老式的网络应用程序。没有来自 jquery 的花哨动画,设计基本上是用一种颜色完成的。我现在的目标是创建一个更好看的应用程序,重新排列事物,引入新效果、新颜色、新感觉。但就像
我的表单需要删除一些表单上的“x”(“智能最小化”- 实际上不是那么智能)和“确定”按钮。不幸的是,当我这样做时,小键盘输入图标从中间移动到右侧,并且下方的栏变成灰色而不是黑色。 我希望能够删除最小化
我是一名优秀的程序员,十分优秀!