【发布时间】:2019-09-21 04:07:15
【问题描述】:
举个例子
#app div {
padding: 10px;
border: 1px solid;
margin: 10px 0;
}
div:focus {
background: red;
}
div:focus:before {
content: "focused";
display: block;
}
<div id="app"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
<script type="text/babel">
let { useState, useRef, Fragment } = React;
let App = () => {
let [, forceUpdate] = useState();
let [num, setNum] = useState(0);
let history = useRef('null');
let keyPressHandler = () => {
history.current = num;
// just to force an update
forceUpdate(Date.now());
};
return (
<Fragment>
<button onClick={()=>{setNum(Date.now())}}>update state</button>
<div tabindex="0" onKeyPress={keyPressHandler}>this div has a keypress listener. <br/>for now whatever key you press it will save the state in a ref, that changes on the button click. <br/>Click the button to change the state then focus this div then press any key to save the state in the ref</div>
<div>State : {num}</div>
<div>History: {history.current}</div>
</Fragment>
);
};
ReactDOM.render(<App />, document.querySelector("#app"));
</script>
现在我要将按键监听器移动到窗口,应该做同样的事情。
#app div {
padding: 10px;
border: 1px solid;
margin: 10px 0;
}
<div id="app"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
<script type="text/babel">
let { useEffect, useState, useRef, Fragment } = React;
let App = () => {
let [, forceUpdate] = useState();
let [num, setNum] = useState(0);
let history = useRef('null');
useEffect(() => {
window.addEventListener("keypress", keyPressHandler);
}, []);
let keyPressHandler = () => {
console.log('called keyPressHandler')
history.current = num;
// just to force an update
forceUpdate(Date.now());
};
return (
<Fragment>
<button onClick={()=>{setNum(Date.now())}}>update state</button>
<div>State : {num}</div>
<div>History: {history.current}</div>
</Fragment>
);
};
ReactDOM.render(<App />, document.querySelector("#app"));
</script>
但是num(state) 并不总是初始值。
【问题讨论】:
-
刚试过
keyDown同样的问题,我不认为是哪个事件的问题 -
如果你不使用sate,你想在这里证明什么,只需使用
history.current = history.current + '-' + key -
@saurabh 我有两个状态,
history.current默认为空,当其中一个状态发生变化时,我将另一个状态存储在history.current -
这正是我的问题,如果您使用
useref,那么您为什么要这样做,那么您可以简单地使用`history.current = history.current + '-' + key`声明你可以直接在jsx中使用val
标签: javascript reactjs