react的学习日常整理
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>React练习</title> <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script> <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script> <!-- 生产环境中不建议使用 --> <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script> <script src="https://cdn.staticfile.org/jquery/2.1.4/jquery.min.js"></script> <!-- 官方CDN--> <!-- <script src="https://unpkg.com/react@16/umd/react.development.js"></script>--> <!-- <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>--> <!-- <!– 生产环境中不建议使用 –>--> <!-- <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>--> </head> <body> <div id="example"></div> <div id="helloworld"></div> <div id="app"></div> <div id="state"></div> <div id="clickButton"></div> <div id="toggle"></div> <div id="condition"></div> <div id="confirm_login"></div> <div id="expression"></div> <div id="list"></div> <div id="ajax"></div> <div id="input"></div> <div id="select"></div> </body> <script type="text/babel"> //封装函数 function tick() { const element = (<div> <h2>你好啊</h2> <h2>现在是{new Date().toLocaleTimeString()}.</h2> </div> ); ReactDOM.render( element, document.getElementById('example') ); } setInterval(tick,1000); </script> <script type="text/babel"> //自定义组件 function HelloMessage(props) { return <h1>Hello {props.name}!</h1>; } const helloworld = <HelloMessage name="World" /> ReactDOM.render( helloworld, document.getElementById("helloworld") ); </script> <script type="text/babel"> //组合组件方式 function Name(props) { return <h1>网站名称:{props.name}</h1>; } function Url(props) { return <h1>网站地址:{props.url}</h1>; } function Nickname(props) { return <h1>网站小名:{props.nickname}</h1>; } function App() { return ( <div> <Name name="百度" /> <Url url="www.baidu.com" /> <Nickname nickname="小度" /> </div> ); } ReactDOM.render( <App/>, document.getElementById("app") ); </script> <script type="text/babel"> //react state(状态) 这是用来减少DOM操作 class Clock extends React.Component{ //构造函数 constructor(props) { super(props); this.state = {date:new Date()}; } //生命周期钩子--渲染完界面后调用 componentDidMount(){ this.jsq = setInterval( () => this.tick(), ); } //卸载组件后调用 componentWillUnmount(){ clearInterval(this.jsq); } //主动调用方法 setState代表状态改变调用 tick(){ this.setState({ date:new Date(), }); } render(){ return( <div> <h3>时间计时器</h3> <h3>现在是{this.state.date.toLocaleTimeString()}.</h3> </div> ); } } ReactDOM.render( <Clock />, document.getElementById("state") ); </script> <script type="text/babel"> //事件 //不能用return false来终止默认行为,要使用preventDefault function ActionLink() { function handleClick(e){ e.preventDefault(); console.log('链接被点击'); } return ( <a href="#" onClick={handleClick}>点我</a> ); } ReactDOM.render( <ActionLink />, document.getElementById("clickButton") ); </script> <script type="text/babel"> //定义一个组件--切换开关的按钮 class Toggle extends React.Component{ constructor(props) { super(props); this.state = {isOpen:true}; //(绑定之后才能在回调函数中调用,我第一次写就漏掉了,会报错) this.handleClick = this.handleClick.bind(this); } handleClick(){ this.setState(prevState => ({ isOpen: !prevState.isOpen })); } //还有一种写法确保this绑定 // handleClick = () => { // console.log('this is:',this); // } render(){ return ( <div> <button onClick={this.handleClick}> {this.state.isOpen?'ON':'OFF'} </button> </div> ); } } ReactDOM.render( <Toggle />, document.getElementById("toggle") ); </script> <script type="text/babel"> //条件渲染 function Register(props) { return <h3>请先注册!</h3> } function Greet(props) { return <h3>欢迎回来!</h3> } function Condition(props) { const isLoginIn = props.isLoginIn; if(isLoginIn){ return <Greet />; }else{ return <Register />; } } ReactDOM.render( <Condition isLoginIn={false} />, document.getElementById("condition") ); </script> <script type="text/babel"> //元素 class LoginConfirm extends React.Component{ constructor(props) { super(props); this.state = {isLoginedIn: false}; } handleLogin = () => { this.setState({isLoginedIn: true}); } handleLoginOut = () => { this.setState({isLoginedIn: false}); } render(){ const isLoginedIn = this.state.isLoginedIn; let button =null; if(isLoginedIn){ //这里使用了this.handleLoginOut是因为方法中绑定了this,注意方法的写法 button = <LogoutButton onClick={this.handleLoginOut} />; }else{ button = <LoginButton onClick={this.handleLogin} />; } return ( <div> <Greeting isLoginedIn={isLoginedIn} /> {button} </div> ); } } function UserGreet(props) { return <h3>欢迎回来!</h3>; } function UserRegister(props) { return <h3>请先注册!</h3>; } function Greeting(props) { const isLoginedIn = props.isLoginedIn; if(isLoginedIn){ return <UserGreet />; }else{ return <UserRegister />; } } function LogoutButton(props){ return( <div> <button onClick={props.onClick}>退出</button> </div> ); } function LoginButton(props){ return( <div> <button onClick={props.onClick}>登陆</button> </div> ); } ReactDOM.render( <LoginConfirm />, document.getElementById("confirm_login") ); </script> <script type="text/babel"> //运算符 function Email(props) { const unreadMessage = props.unreadMessage; return( <div> <h3>测试加入运算符计算</h3> <p>true&&表达式 为真输出后面表达式 为假不会输出</p> { unreadMessage.length > 0 && <h3>您有{unreadMessage.length}条未读消息</h3> } </div> ); } const message = ['1','2','3','4']; ReactDOM.render( <Email unreadMessage = {message} />, document.getElementById("expression") ); </script> <script type="text/babel"> //列表 function NumberList(props) { const number = props.number; const listItem = number.map((v)=> <li key={v.toString()}> {v} </li> ); return ( <ul>{listItem}</ul> ); } const number = [1,2,3,4,5]; ReactDOM.render( <NumberList number={number} />, document.getElementById("list") ); </script> <script type="text/babel"> //react ajax class HttpAjax extends React.Component{ constructor(props) { super(props); this.state = {username:'',lastUrl:''}; } componentDidMount(){ this.request = $.get(this.props.source,function (res) { var result = res[0]; this.setState({ username:result.owner.login, lastUrl: result.html_url }); }.bind(this)); } componentWillUnmount(){ this.request.abort(); } render(){ return ( <div> {this.state.username}用户最新的gist共享地址: <a href={this.state.lastUrl}>{this.state.lastUrl}</a> </div> ); } } ReactDOM.render( <HttpAjax source="https://api.github.com/users/octocat/gists" />, document.getElementById("ajax") ); </script> <script type="text/babel"> //表单元素 class InputChange extends React.Component{ constructor(props) { super(props); this.state = {value:'Hello Tom!'}; this.handleChage = this.handleChage.bind(this); } handleChage(event){ this.setState({value:event.target.value}); } render(){ var value = this.state.value; return ( <Content myData = {value} upData = {this.handleChage} /> ); } } function Content(props){ return ( <div> <input type="text" value={props.myData} onChange={props.upData} /> <h3>{props.myData}</h3> </div> ); } ReactDOM.render( <InputChange />, document.getElementById("input") ); </script> <script type="text/babel"> //下拉框 class Forms extends React.Component{ constructor(props) { super(props); this.state = {value:'0'}; this.changeSelect = this.changeSelect.bind(this); this.formSubmit = this.formSubmit.bind(this); } changeSelect(event){ this.setState({value:event.target.value}); } formSubmit(event){ alert('您的选择是:'+ this.state.value); event.preventDefault(); } render(){ return( <form onSubmit={this.formSubmit}> <lable>选择您最喜欢的网站</lable> <select value={this.state.value} onChange={this.changeSelect} > <option value="0">--请选择--</option> <option value="gg">谷歌</option> <option value="jd">京东</option> <option value="tb">淘宝</option> <option value="dw">得物</option> </select> <input type="submit" value="提交" /> </form> ); } } ReactDOM.render( <Forms />, document.getElementById("select") ); </script> </html>