用于构建用户界面的 JavaScript 库javascript
stylecss
let style = { color: 'r'+'ed', fontSize: '30px' } let jsx = <div style={style}>jsx...</div>;
classNamejava
import './index.scss'; let jsx = ( <div className="jsx"> jsx... </div> );
变量的使用和条件判断react
let name = "Jomsou"; let flag = false; let jsx = ( <div> { flag ? <p> I am {name} </p> : <p> I am not {name}</p>} </div> );
数组循环数组
let names = ['jomsou', 'marry', 'james'] let jsx = ( <div> { names.map((name, index)=><p key={index}>Hello, I am {name}</p>)} </div> );
ES5 function Component() { return <h1>I am Jomsou</h1> } ES6 class ES6component extends React.Component{ render(){ return <h1>I am Jomsou</h1> } } ReactDOM.render( <div> <Component/> <ES6component/> </div>, document.getElementById('app') );
state:状态,即全部参数
setState:设置状态变化
super:继承父组件的this指针react-router
class ES6component extends React.Component{ constructor(props){ super(props); this.state = { name: 'Jomsou' } } render(){ //用于异步操做 setTimeout(() => { this.setState({ name: 'Jomsou Can' }) }, 2000); return <h1>I am {this.state.name}</h1> } } ReactDOM.render( <div> {/* <Component/> */} <ES6component/> </div>, document.getElementById('app') );
props: 父组件往子组件里传递东西app
class ES6component extends React.Component{ constructor(props){ super(props); } render(){ return <h1>I am {this.props.name}</h1> } } ReactDOM.render( <div> <ES6component name="Jomsou STC"/> </div>, document.getElementById('app') );
方式1:dom
一、按钮button点击后,this会改变,因此须要在constructor中加this.handleClick = this.handleClick.bind(this);
异步
handleClick(){ this.setState({ age: this.state.age+1 }) } render(){ return ( <div> <h1>I am {this.state.name}</h1> <p>I am {this.state.age} years</p> <button onClick={this.handleClick}>加一岁</button> </div> ) }
方式2:函数
onValChange(e){ this.setState({ age: e.target.value }) } render(){ return ( <div> <h1>I am {this.state.name}</h1> <p>I am {this.state.age} years</p> <input type="text" onChange={(e)=>this.onValChange(e)} /> </div> ) }
class Title extends React.Component { render(props){ // return <h1>{this.props.title}</h1> return <h1>{this.props.children}</h1> } } class App extends React.Component { render(){ return ( <div> {/* 容器式组件 */} {/* <Title title="App Title"/> */} <Title> <span>App Span</span> <a href="">link</a> </Title> <hr/> {/* 单纯组件 */} <Component/> </div> ) } }
用props传值
class Title extends React.Component { render(props){ <h1>{this.props.title}</h1> } } class Father extends React.Component { constructor(props){ super(props); } render(){ return ( <div}> <Title title="App Title"/> </div> ) } }
经过回调函数
class Child extends React.Component { constructor(props){ super(props); } handleClick(){ this.props.onChangeColor('red'); } render(){ return ( <div> <h1>父组件的背景颜色:{this.props.bgColor}</h1> <button onClick={(e)=>this.handleClick(e)}>改变颜色</button> </div> ) } } class Title extends React.Component { render(props){ return <h1>{this.props.children}</h1> } } class Father extends React.Component { constructor(props){ super(props); this.state = { bgColor: '#999' } } onChangeColor(color){ this.setState({ bgColor: color }) } render(){ return ( <div style={{background: this.state.bgColor}}> <Child bgColor={this.state.bgColor} onChangeColor={color=>this.onChangeColor(color)}/> </div> ) } } ReactDOM.render( <div> <Father/> </div>, document.getElementById('app') );
状态提高——先提高到父组件上,再到兄弟组件里
class Child1 extends React.Component { constructor(props){ super(props); } handleClick(){ this.props.changeChild2Color('red'); } render(){ return ( <div> <h1>child1:{this.props.bgColor}</h1> <button onClick={(e)=>this.handleClick(e)}>改变颜色</button> </div> ) } } class Child2 extends React.Component { constructor(props){ super(props); } render(){ return ( <div style={{background: this.props.bgColor}}> <h1>Child2:{this.props.bgColor}</h1> </div> ) } } class Title extends React.Component { render(props){ return <h1>{this.props.children}</h1> } } class Father extends React.Component { constructor(props){ super(props); this.state = { bgColor: '#999' } } onChangeChild2Color(color){ this.setState({ bgColor: color }) } render(){ return ( <div> <Child1 changeChild2Color={(color)=>this.onChangeChild2Color(color)}/> <Child2 bgColor={this.state.bgColor}/> </div> ) } } ReactDOM.render( <div> <Father/> </div>, document.getElementById('app') );
从生到死
做用:
挂载阶段
constructor componentWillMount render componentDidMount
有更新的状况
componentWillReceiveProps//若是父组件向子组件传值,执行 shouldComponentUpdate: 默认是true,能够更新//设置为flase则没有如下步骤 componentWillUpdate render componentDidUpdate
卸载阶段
componentWillUnmount
历史--栈的形式
跳转--可传递数据
事件
常见的Router
window.location.href="https://www.baidu.com"
window.loaction = '#hash'; window.onhashchange = function(){ console.log('current hash:', window.location.hash) }
包括页面跟hash路由
//推动一个状态 history.pushState('name', 'title', '/path'); //替换一个状态 history.replaceState('name', 'title', '/path'); //popstate window.onpopstate = function(){ console.log(window.location.href); console.log(windos.location.pathname); }
HashRouter和BrowserRouter
import React from 'react'; import ReactDOM from 'react-dom'; import { HashRouter as Router, Route, Link } from 'react-router-dom'; class A extends React.Component { constructor(props) { super(props) } render() { return ( <div>Component A</div> ) } } class B extends React.Component { constructor(props) { super(props) } render() { return ( <div>Component B</div> ) } } class Wraper extends React.Component { constructor(props) { super(props) } render() { return ( <div> <Link to="/a">组件A</Link> <br/> <Link to="/b">组件B</Link> {this.props.children} </div> ) } } ReactDOM.render( <Router> <Wraper> <Route path="/a" component={A} /> <Route path="/b" component={B} /> </Wraper> </Router> , document.getElementById('app'));
若是把hashRouter改为BrowserRouter,则变成