以下是HTML。
<script src="https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xtp1/t39.3284-6/12624079_897774290317920_1379776191_n.js"></script> <script src="https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfp1/t39.3284-6/12624052_751451571621845_431133942_n.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js"></script> <div class="row" id="container"> <div class="controls"> <span class="" id="controls-size">Size : <button id="controls-size-small">SMALL</button> <button id="controls-size-med">MEDIUM</button> <button id="controls-size-large">LARGE</button> </span> </div> <div id="game-container"> </div> </div>
以下是Javscript
var SizeEnum = { SMALL: 1, MEDIUM: 2, LARGE: 3 }; var Board = React.createClass({ getInitialState: function() { return { size: SizeEnum.MEDIUM }; }, componentWillMount: function() { if (this.state.size == SizeEnum.SMALL) { this.style = { width: 600 + 'px', height: 320 + 'px', margin: 'auto', border: '2px solid red' } } else if (this.state.size == SizeEnum.MEDIUM) { this.style = { width: 700 + 'px', height: 500 + 'px', margin: 'auto', border: '2px solid red' } } else if (this.state.size == SizeEnum.LARGE) { this.style = { width: 900 + 'px', height: 720 + 'px', margin: 'auto', border: '2px solid red' } } }, render: function() { return ( < div style = { this.style } > < /div> ) } }); ReactDOM.render(<Board / > , document.getElementById("game-container"));
还有一些CSS
#game-container { position: relative; margin-top: 32px; border: 1px solid black; width: 100%; }
我要的是单击适当的按钮后,将Board组件的大小调整为适当的大小。
我已经尝试过这样
var board = ReactDOM.render(<Board />, document.getElementById("game-container")); document.getElementById("controls-size-small").onclick = changeBoardSize; document.getElementById("controls-size-med").onclick = changeBoardSize; document.getElementById("controls-size-large").onclick = changeBoardSize; function changeBoardSize(event) { var etid = event.target.id; console.log(etid); if (etid == "controls-size-small") { // method 1 board.state.size = SizeEnum.SMALL; } else if (etid == "controls-size-med") { // method 2 board.state.size = SizeEnum.MEDIUM; ReactDOM.render(<Board />, document.getElementById("game-container")); } else if (etid == "controls-size-small") { // method 3 board.setState({size: SizeEnum.SMALL}); ReactDOM.render(<Board />, document.getElementById("game-container")); } }
但这是行不通的。
您不能像这样设置React组件的状态。并且组件应负责设置自己的状态。
在您的Board组件内部,在componentDidMount中设置事件侦听器。最好的解决方案是让按钮成为React应用程序的一部分,但这超出了此问题的范围。因此,假设按钮不是React应用程序的一部分,然后执行以下操作:
var Board = React.createClass({ ... ... componentDidMount: function(){ var that = this; document.getElementById("controls-size-small").addEventListener('click', that.changeBoardSize, false); document.getElementById("controls-size-med").addEventListener('click', that.changeBoardSize, false); document.getElementById("controls-size-large").addEventListener('click', that.changeBoardSize, false); } changeBoardSize: function(e){ /* get the element id and do the enum things here */ this.setState({ size: newSize }); } render: function(){ ... ... } });
然后只需将所有那些componentWillMount样式的东西移动到render函数中即可。
render
更新资料
小提琴:https : //jsfiddle.net/dannyjolie/r525ux66/