在使用react-redux组件过程中,发现打印document.activeElement,一直就是document.body,无法修改当前获得元素的焦点?有朋友遇到这种问题么?
React焦点无法修改问题
Ad007
#3
因为是redux外面包裹了一层container,希望当前的焦点是在组件上,也就是
this.element = ReactDOM.findDOMNode(this);
this.element.focus();
但是后面这一句是失效的,焦点并没有在当前组件上面,打印发现当前的document.activeElement还是在body上面
Ad007
#5
redux.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import Main from './components/main/Main';
import store from './store';
ReactDOM.render(
<Provider store={store}>
<AttentionContainer />
</Provider>,
document.getElementById('app')
);
AttentionContainer.js
import { connect } from 'react-redux';
import AttentionScreen from '../components/AttentionScreen/AttentionScreen';
const mapStateToProps = (state) => ({
// 从 store 取得 message state
message: state.getIn(['message', 'message'])
});
const mapDispatchToProps = null;
/*react-redux 所提供的 API connect 将 props 传给 Component,其用法如下:
* connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
* */
export default connect(
mapStateToProps,
mapDispatchToProps,
)(AttentionScreen);
AttentionScreen.js
import React from 'react';
import ReactDOM from 'react-dom';
import BaseComponent from 'base-component';
import SoftKeyStore from 'soft-key-store';
import ReactSoftKey from 'react-soft-key';
import SimpleNavigationHelper from 'simple-navigation-helper';
export default class AttentionScreen extends BaseComponent {
constructor(props) {
super(props);
this.state = {
message: props.message
};
}
componentDidMount() {
console.log('AttentionScreen componentDidMount.');
this.element = ReactDOM.findDOMNode(this);
if (document.activeElement === document.body) {
this.element.focus();
ReactDOM.findDOMNode(this.refs.softkey).focus();
}
console.log(' WWE--1--> ' + this.element.innerHTML);
console.log(' WWE--2--> ' + document.activeElement.innerHTML);
console.log(' WWE--3--> ' + document.body.innerHTML);
SoftKeyStore.register({
left: 'delete',
center: 'tcl-cmas-ok',
right: 'options'
}, this.element);
document.addEventListener('keydown', this);
}
handleEvent(event) {
console.log('cuisx:: event.key -> ' + event.key);
switch(event.key) {
case 'Enter':
break;
case 'SoftLeft':
break;
case 'SoftRight':
break;
case 'BrowserBack':
case 'Backspace':
window.close();
break;
}
}
render() {
return(
<form role="dialog" data-type="confirm">
<section>
<h1 data-l10n-id="emergency-alerts">{this.state.message.get('title')}</h1>
<div id="container">
<div id="icon"></div>
<p id="alert-content">{this.state.message.get('body')}</p>
</div>
</section>
<ReactSoftKey ref="softkey" />
</form>);
}
}
Ad007
#9
已解决,应该是虚拟DOM树的原因,直接在UI绘制完成后,监听body是否已经加载完成,只有dom树加载完成后才可以附着焦点.
document.body.onload = function(){
document.querySelector('#alert-content').focus();
}