反应文件指出render
函数应该是纯这意味着它不应该使用this.setState
它.但是,我相信,当状态依赖于"远程",即从阿贾克斯call.The唯一的解决办法的结果是setState()
一个内部render
功能
在我的情况下.我们的用户可以登录.登录后,我们还需要检查用户的访问权限(ajax调用)来决定如何显示页面.代码是这样的
React.createClass({
render:function(){
if(this.state.user.login)
{
//do not call it twice
if(this.state.callAjax)
{
var self=this
$.ajax{
success:function(result)
{
if(result==a)
{self.setState({callAjax:false,hasAccess:a})}
if(result==b)
{self.setState({callAjax:false,hasAccess:b})}
}
}
}
if(this.state.hasAccess==a) return <Page />
else if(this.state.hasAccess==a) return <AnotherPage />
else return <LoadingPage />
}
else
{
return <div>
<button onClick:{
function(){this.setState({user.login:true})}
}>
LOGIN
</button>
</div>
}
}
})
Run Code Online (Sandbox Code Playgroud)
ajax调用不能出现,componentDidMount
因为当用户单击LOGIN按钮时,页面被重新呈现并且还需要ajax调用.所以我认为唯一的地方setState
是在render
函数内部违反了React原则
更好的解决方案?提前致谢
当我读取socket.io 客户端API时,请注意api公开Manger和Socket接口,它在事件和方法方面看起来非常相似
另外,我可以从文档中得出结论,我们可以从套接字实例获取管理器实例,socket.io
并且管理器实例包含和套接字实例manager.engine
.这就是我所知道的
鉴于他们的API几乎相同,例如,我不能说manager.disconnet()
和之间有任何区别socket.disconnect()
.我认为根本原因是我无法获得当时的关系
用于创建 React 组件的 es6 语法是 。export default class ExampleComponent extends React.Component
但是它仍然可以在export default class ExampleComponent
没有extends React.Component
条件的情况下工作import React from 'react'
;为什么会这样
我以为在componentWillUpdate
被召唤时,我可以阅读最新的状态,即状态this.state
.但是,在我仔细检查文件后,我意识到自己错了.事实是,即使在之后componentWillUpdate
被调用this.state
,它仍然会读取"旧"状态.这个设计有什么意义?怎么componentWillUpdate
有用?
最近,我们想在React中实现一些动画,这就是我们想要的:当发生某件事(从webSocket接收消息)时,重新排列React组件的列表。在我的情况下,列表中该项目只有一个位置将被更改。因此,首先从原始位置淡出该项目,然后将其淡入正确的位置。我的解决方案是使用JQuery删除并添加相应的项目DOM,因为它易于实现动画(淡入和淡出),同时我还正确地更新了底层数据结构(React依赖于此渲染)以期望使React下次再次基于emitChange时的状态正确渲染DOM。但是,即使基础数据结构正确,React仍无法按预期工作,顺序仍然混乱。有趣的是,当我在Chrome中检查了react插件时,正确,但是,当我检查真实的DOM时,顺序是不正确的。显然,两个DOM 不同步
有办法解决吗?
另外,我阅读了React加载项的动画部分,但是,我认为它是有限的,当我重新排序列表时,动画不适用。如果有实现此目标的反应方法,我将不胜感激
我在React玩了几年,在某些情况下仍然对mount / unmount机制感到困惑。
由于安装/卸载是执行副作用的地方,因此我不希望它们被随机调用。所以我需要弄清楚它们是如何工作的。据我目前所了解,当虚拟dom不存在于实际dom中时,往往会被卸载。但是,这似乎不是全部,我无法对此进行推理
function TestMount(props) {
useEffect(() => {
console.log("componentDidMount", props.name);
return () => {
console.log("componentWillUnount", props.name);
};
}, []);
return <h1>Test content {" " + JSON.stringify(props.name)}</h1>;
}
function Update({ click }) {
return <button onClick={click}>Update</button>;
}
function App() {
const [count, setCount] = useState(0);
const Component = name => <TestMount name={name} />;
return (
<div className="App">
<h1>{count}</h1>
<Component name="one" />
{Component("two")}
<Update click={() => setCount(x => x + 1)} />
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App …
Run Code Online (Sandbox Code Playgroud)