|
@@ -0,0 +1,84 @@
|
|
|
|
+<!DOCTYPE html>
|
|
|
|
+<html lang="en">
|
|
|
|
+ <head>
|
|
|
|
+ <meta charset="UTF-8" />
|
|
|
|
+ <meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
|
|
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
+ <title>Document</title>
|
|
|
|
+ <script src="../../babel.min.js"></script>
|
|
|
|
+ <script src="../../react.development.js"></script>
|
|
|
|
+ <script src="../../react-dom.development.js"></script>
|
|
|
|
+ </head>
|
|
|
|
+ <body>
|
|
|
|
+ <div id="root"></div>
|
|
|
|
+ <script type="text/babel">
|
|
|
|
+ function App() {
|
|
|
|
+ // 需要 我们自己创建一个对象(ref对象 ==> {current: 组件实例}) 和 要获取的组件 建立ref绑定关系
|
|
|
|
+ const counterRef = React.createRef();
|
|
|
|
+ const inputRef = React.createRef();
|
|
|
|
+ return (
|
|
|
|
+ <div className="app">
|
|
|
|
+ <button
|
|
|
|
+ onClick={() => {
|
|
|
|
+ console.log(`output->counterRef`, counterRef);
|
|
|
|
+ console.log(`output->inputRef`, inputRef);
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ 获取Counter组件实例
|
|
|
|
+ </button>
|
|
|
|
+ <input type="text" ref={inputRef} />
|
|
|
|
+ {/*通过组件元素的ref属性 和 上面创建的ref对象 建立绑定关系*/}
|
|
|
|
+ <Counter ref={counterRef} />
|
|
|
|
+ </div>
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ class Counter extends React.Component {
|
|
|
|
+ constructor(props) {
|
|
|
|
+ super(props);
|
|
|
|
+
|
|
|
|
+ this.state = {
|
|
|
|
+ c: 0,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ this.handleAddOne = this.handleAddOne.bind(this);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ handleAddOne() {
|
|
|
|
+ // this
|
|
|
|
+ // ? this.state.c 是上一次状态吗。不一定。因为 setState状态的更新 可能是异步的
|
|
|
|
+ // 如果当前新状态 的值 需要依赖 上一次状态的值 运算才能计算出 这个时候 就不能像下面方式写
|
|
|
|
+ // this.setState({ c: this.state.c + 1 });
|
|
|
|
+ // 为了 准确获取上一次状态 可以给 setState方法 传入一个回调函数:该函数会接收两个参数:prevState、props。传入的回调函数 在返回一个新的状态对象即可
|
|
|
|
+ this.setState((prevState) => {
|
|
|
|
+ return { c: prevState.c + 1 };
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ render() {
|
|
|
|
+ let { c } = this.state;
|
|
|
|
+ return (
|
|
|
|
+ <div className="counter">
|
|
|
|
+ <p>当前计数:{c}</p>
|
|
|
|
+ <p>
|
|
|
|
+ <button
|
|
|
|
+ onClick={() => {
|
|
|
|
+ // this
|
|
|
|
+ this.setState(({ c }) => ({ c: c - 1 }));
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ -
|
|
|
|
+ </button>
|
|
|
|
+ <button onClick={this.handleAddOne}>+</button>
|
|
|
|
+ </p>
|
|
|
|
+ </div>
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const root = ReactDOM.createRoot(document.querySelector('#root'));
|
|
|
|
+
|
|
|
|
+ root.render(<App />);
|
|
|
|
+ </script>
|
|
|
|
+ </body>
|
|
|
|
+</html>
|