Learning note for React
代码片段在https://codesandbox.io/dashboard/sandboxes/?workspace=21c09ad6-4546-46a4-8740-fa5a1f9e3798
新建React项目
有index.html,里边要有一个div的id是root
新建index.js并且使用
1 2 3 4 5 6 7 8 9 10 11 var React = require ("react" );var ReactDOM = require ("react-dom" );ReactDOM.render( <div > <p > Created by {name}</p > <p > Copyright {year}</p > </div > , document .getElementById("root" ) );
就可以在root元素里渲染一个div元素,render函数第一个输入只能是一个element,所以需要用div包裹。
要想给元素添加class需要使用className=“”
。
1 2 3 4 5 6 7 8 9 10 11 12 13 var imglink = "https://picsum.photos/200" ;var content = ( <div > <h1 className ="qwe" > Hello World</h1 > <img src ={imglink} /> <img src ={imglink + "?grayscale "} /> <ul > <li > 1</li > <li > 2</li > <li > 3</li > </ul > </div > );
要想添加inline-styling需要使用style={{color:"red"}}
还可以使用:
1 2 3 4 5 const customStyle = { color :"red" , fontSize :"20px" } style={customStyle}
使用app.jsx规范代码格式
一般来讲新建一个app.jsx文件来管理内容,而index.js里只引用app的函数。
1 2 3 4 5 6 7 import React from "react" ;function app ( ) { return <div > hello</div > ; } export default app;
1 2 3 4 5 6 7 8 var React = require ("react" );var ReactDOM = require ("react-dom" );import app from "./App.jsx" ;ReactDOM.render(app(), document .getElementById("root" ));
使用react dev tool 可以查看当前网页树状图
React module
单文件使用component: 1 2 3 4 5 6 function Heading ( ) { return <h1 > Heading</h1 > } <div> <Heading > </Heading > </div>
注意component文件名和方程名必须用大写字母开头.
如果在另一个文件中定义module,另一个文件需定义成.jsx文件
1 2 3 4 5 6 7 8 import React from "react" function Heading ( ) { return <h1 > Heading</h1 > } export default Heading
一般来讲在index中只有一个app组件,然后新建一个叫app的文件来包含所有其他东西
ES6相关
JSX
JSX可以让用户在JS代码里添加HTML代码。
export
如果只export一个东西就使用export default x
,
但是如果想要暴露多个变量或函数就需要用大括号包起来,例如export {x1,x2,x3}
. 一个文件只能使用一次default,但是可以用很多次大括号export
在imoprt的时候如果使用import x from "./a.js"
就是引入默认的输出
如果使用import * as x from './a.js'
就是引入所有东西,之后可以使用a.a1来使用
Map/filter/reduce
Map可以通过loop一个数组的全部元素来获得一个新数组
Filter可以使用某种条件来过滤数组里所有内容
Reduce可以累计数组元素并且返回一个值
find可以找到数组里第一个符合条件的内容
findindex可以找到第一个index
es6里用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 var numbers = [3 , 56 , 2 , 48 , 5 ];var newNumbers = numbers.map(function (x ) { return x + 1 ; }); console .log(newNumbers);var numberfilter = numbers.filter(function (x ) { return x > 6 ; }); console .log(numberfilter);var numberreduce = numbers.reduce(function (accu, curr ) { return accu + curr; }); console .log(numberreduce);var num1 = numbers.find(function (num ) { return num > 10 ; }); console .log(num1);var index = numbers.findIndex(function (num ) { return num > 10 ; }); console .log(index);
Arrow function
箭头函数用于需要用匿名函数的地方,可以用来省略function定义名
1 2 3 4 5 6 7 8 9 10 11 12 var numbers = [3 , 56 , 2 , 48 , 5 ];var newNumbers = numbers.map((x ) => { return x + 1 ; }); var newNumbers = numbers.map((x ) => x + 1 );var newNumbers = numbers.map(x => x + 1 );
React Prop
可以把一段重复的HTML封装到一个函数里,然后通过传参的方式来复用,只是这里传参是从properties的位置传参。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 function Card (props ) { return ( <div > <h2 > {props.name}</h2 > <img src ={props.img} alt ="avatar_img" /> <p > {props.tel}</p > <p > {props.email}</p > </div > ); } ReactDOM.render( <div > <h1 > My Contacts</h1 > <Card name ="Beyonce" img ="https://blackhistorywall.files.wordpress.com/2010/02/picture-device-independent-bitmap-119.jpg" tel ="+123 456 789" email ="[email protected] " /> <Card name ="Jack Bauer" img ="https://pbs.twimg.com/profile_images/625247595825246208/X3XLea04_400x400.jpg" tel ="+7387384587" email ="[email protected] " /> </div > , document .getElementById("root" ) );
React map
假如x是一个数组,在React
里使用x.map(func)
可以实现遍历x数组里每一个元素i,将i传入func中执行然后获得返回值。
这里map返回的元素需要有一个prop叫做key,它不能直接被访问到并且他的值需要是唯一的。
正确用法是复用刚刚新建的封装好的函数中,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function Entry (content ) { return ( <div className ="term" > <dt > <span className ="emoji" role ="img" aria-label ="Tense Biceps" > {content.emoji} </span > <span > {content.name}</span > </dt > <dd > {content.meaning}</dd > </div > ); } function createEntry (content ) { return ( <Entry key ={content.id} emoji ={content.emoji} name ={content.name} meaning ={content.meaning} /> ); }
React conditional rendering
可以根据变量值的不同来渲染不一样的组件
利用三元运算符实现
1 2 3 4 5 function App ( ) { return <div > {var1 ? <h1 > Hello</h1 > : <h1 > World</h1 > } </div > }
也可以用null表示什么都不渲染
如果使用React的and运算符&&可以实现相同的效果,只有左边是true的时候才会运行运算符右边的代码
React State
用户界面会根据变量值的变化而变化。
如
1 2 var isDone = false ;return <p style ={isDone? style1:null }> Buy milk </p >
但是如果动态修改变量的值渲染不会跟着改变,需要使用hooks。使用useState来保存和更新需要变化的变量。usestate返回两个内容,第一个是变量,第二个是setstate函数来设置变量值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 function App ( ) { const [count, setCount] = useState(0 ); function increase ( ) { setCount(count + 1 ); } function decrease ( ) { setCount(count - 1 ); } return ( <div className ="container" > <h1 > {count}</h1 > <button onClick ={decrease} > -</button > <button onClick ={increase} > +</button > </div > ); }
简单应用
复杂State
State也可以作为一个object存在,只需要在useState里加就行
1 2 3 4 const [fullName, setFullName] = useState({ fName : "" , lName : "" });
在修改的时候需要注意,直接修改会抹去之前的状态,所以需要保存之前状态同时添加新状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function handleChange (event ) { const { name, value } = event.target; setFullName(prevValue => { if (name === "fName" ) { return { fName : value, lName : prevValue.lName }; } else if (name === "lName" ) { return { fName : prevValue.fName, lname : value }; } }); }
或者使用Spread operator来实现:
1 2 3 4 5 6 7 8 9 10 11 12 function handleChange (event ) { const { name, value } = event.target; setFullName(prevValue => { return { ...prevValue, [name]: value } }); }
React handle Event 事件管理
mouseover,mouseout之类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 function App ( ) { const [headingText, setHeadingText] = useState("Hello" ); const [isMousedOver, setMouseOver] = useState(false ); function handleClick ( ) { setHeadingText("Submitted" ); } function handleMouseOver ( ) { setMouseOver(true ); } function handleMouseOut ( ) { setMouseOver(false ); } return ( <div className ="container" > <h1 > {headingText}</h1 > <input type ="text" placeholder ="What's your name?" /> <button style ={{ backgroundColor: isMousedOver ? "black " : "white " }} onClick ={handleClick} onMouseOver ={handleMouseOver} onMouseOut ={handleMouseOut} > Submit </button > </div > ); }
处理表单相关event:
使用onChange 来处理输入event。