React组件
一、函数式组件
①无状态的函数式组件
<div id="app"></div> <script src="node_modules/@babel/standalone/babel.js"></script> <script src="node_modules/react/umd/react.development.js"></script> <script src="node_modules/react-dom/umd/react-dom.development.js"></script> <script type="text/babel"> //组件的名字首字母大写 // 这种函数式组件也是无状态的 function AppHeader() { return ( <div className="header"> <h2>头部部分</h2> </div> ) } function AppContent() { return ( <div className="content"> <h3>中间内容部分</h3> </div> ) } function AppFooter() { return ( <div className="footer"> <h2>尾部部分</h2> </div> ) } const element = ( <div> <AppHeader /> <AppContent /> <AppFooter /> </div> ) ReactDOM.render(element,document.getElementById('app'))
②有参数的函数式组件
<div id="app"></div> <script src="node_modules/@babel/standalone/babel.js"></script> <script src="node_modules/react/umd/react.development.js"></script> <script src="node_modules/react-dom/umd/react-dom.development.js"></script> <script type="text/babel"> //组件的名字首字母大写 // 这种函数式组件也是无状态的 function Welcome(props) { return <h2>hello {props.name}</h2> } const element = ( <div> <Welcome name='eric' /> <Welcome name='jack' /> <Welcome name='lisa' /> </div> ) ReactDOM.render(element,document.getElementById('app')) </script>
二、类方式组件
①基本的类方式组件
<div id="app"></div> <script src="node_modules/@babel/standalone/babel.js"></script> <script src="node_modules/react/umd/react.development.js"></script> <script src="node_modules/react-dom/umd/react-dom.development.js"></script> <script type="text/babel"> //class组件类,必须继承自React.Component才是一个组件类,否则就是一个普通的类 // class组件类,必须通过render函数返回组件模板 class MyComponent extends React.Component{ render(){ return( <div> <h2>Component</h2> </div> ) } } const element = ( <div> <MyComponent /> <MyComponent></MyComponent> </div> ) ReactDOM.render(element,document.getElementById('app')) </script>
②有状态的类方式组件
<div id="app"></div> <script src="node_modules/@babel/standalone/babel.js"></script> <script src="node_modules/react/umd/react.development.js"></script> <script src="node_modules/react-dom/umd/react-dom.development.js"></script> <script type="text/babel"> //如果子类加入了构造函数 constructor,则一定要手动调用父类的构造函数super() // React 组件需要通过手动为组件添加state成员来初始化:ViewModel // state等价于Vue中的data,接下来就可以在该组件管理的模板中通过{}来访问绑定数据 // handleClick方法里面的this默认是window,而不是实例对象,需要通过方法改变这个this的指向 // 需要修改state里的数据并且希望视图更新,则一定要使用this.setState方法 class MyComponent extends React.Component{ constructor(props) { super(props); this.state = { message:'hello world' } } render(){ return( <div> <h2>{this.state.message}</h2> <h2>{this.state.message}</h2> <h2>{this.state.message}</h2> <button onClick={this.handleClick.bind(this)}>点击改变message</button> </div> ) } handleClick(){ this.setState({ message:'good job' }) } } const element = ( <div> <MyComponent /> </div> ) ReactDOM.render(element,document.getElementById('app')) </script>
三、事件绑定的this指向问题
①第一种绑定方式,this指向的是window,默认接收一个参数event(事件源对象),不接收额外的参数
②第二种绑定方式,使用bind,默认接收一个参数参数event(事件源对象),支持接收额外的参数,手动传递的参数会放到函数的最前面,event会作为函数的最后一个参数
③第三种绑定方式,使用箭头函数,自动bind(this),支持接收额外的参数,手动传递的参数会放到函数的最前面,event会作为函数的最后一个参数
<div id="app"></div> <script src="node_modules/@babel/standalone/babel.js"></script> <script src="node_modules/react/umd/react.development.js"></script> <script src="node_modules/react-dom/umd/react-dom.development.js"></script> <script type="text/babel"> class MyComponent extends React.Component{ constructor(props) { super(props); this.state = { message:'hello world' } } render(){ return( <div> <h2>{this.state.message}</h2> <h2>{this.state.message}</h2> <h2>{this.state.message}</h2> <button onClick={()=>{this.handleClick()}}>点击改变message</button> </div> ) } handleClick(){ this.setState({ message:'good job' }) } } const element = ( <div> <MyComponent /> </div> ) ReactDOM.render(element,document.getElementById('app')) </script>
④补充:bind的用法
<script> function fn(a,b,c,d,e,f){ console.log(a,b,c); console.log(d,e,f); } // 绑定的同时传递参数,预传参,不调用 var newFn = fn.bind(this,1,2,3) // 调用的时候传递参数,该参数会和预传递的参数合并到一起作为函数参数 newFn() //1 2 3 undefined undefined undefined newFn(4,5,6) // 1 2 3 4 5 6 </script>