安裝create-react-apphtml
npm install create-react-app -g
建立項目前端
creact-react-app demos cd demos npm start
package.jsonnode
"scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" }
npm start
啓動開發環境,npm run build
建立生產環境優化代碼,npm test
用於測試單元,npm run eject
把潛藏在react-scripts中的一序列技術棧「彈射」到
應用的頂端,此命令不可逆且會改變和增長一些文件。react
- 用戶看到的界面(UI),是一個 純函數(render) 的執行結果,只接受數據(data)做爲參數;
- 純函數:沒有任何反作用,輸出徹底依賴於輸入的函數;
- 對於react開發者,重要的是區分哪些屬於data,哪些屬於render,要更新界面,要作的就是更新data;
- react實踐的也是"響應式編程"的思想。
屬性使用算法
data-*
;JavaScript表達式使用npm
樣式編程
註釋json
數組數組
事件掛載瀏覽器
HTML直接使用onclick缺點:
JSX中的onClick事件(不存在以上問題)
function Demo(){ const name = 'jsx'; const arr = [ <h3 key = {0}>數組</h3> <p key = {1}>數組會自動展開,注意添加key屬性</p> ]; const func = () => { let result = 'hello'; if (name){ result += name; } else { result += 'world'; } return result; }; return ( <div> <h2></h2> {/*註釋*/} <p style = {{color: 'red',fontSize: '14px'}}>hello {name || 'world'}</p> <p className = {name ? 'classA' : 'classB'}> hello {name && 'world'} </p> <p> {func()} </p> {arr} </div> ) }
React的prop
給prop賦值
class Demo extends Component{ render(){ return( <div> <Child caption = "toProp" initValue = {0}/>//給子組件<Child />傳入caption和initValue信息,子組件需定義相關prop接口 </div> ) } }
讀取prop值
- 給
this.prop
賦值是React.Component
構造函數的工做之一;- 若是一個組件須要定義本身的構造函數,必定要在構造函數的第一行
super
調用父類也就是React.Component
的構造函數;- 若是沒有在構造函數中調用
super(props)
,那麼組件實例被構造以後,類實例的全部成員就沒法經過this.props
訪問到父組件傳遞過來的props
值。
class Child extends Component{ constructor(props){ super(props); this.state = { //獲取外部傳入的prop,並用於state初始化 count: props.initValue || 0, caption: props.caption } } }
propTypes檢查
React.PropTypes.*
,需導入prop-types
npm install prop-type --save
導入import PropTypes from ('prop-types')
propTypes驗證器
PropTypes.array
PropTypes.bool
PropTypes.func
PropTypes.number
PropTypes.object
PropTypes.string
PropTypes.node
PropTypes.element
PropTypes.instanceOf(Message)
PropTypes.oneOf(['News','Photos'])
PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.instanceOf(Message)
])
PropTypes.arrayOf(PropTypes.number)
PropTypes.objectOf(PropTypes.number)
PropTypes.shape({
color: PropTypes.string,
fontSize: PropTypes.number
})
PropTypes.func.isRequired
eg: Child.propTypes = { initValue: PropTypes.number, caption: PropTypes.string }
state表明組件的內部狀態,因爲React組件不能修改傳入的prop,因此須要使用state記錄自身數據變化;
state初始化
constructor(props){ ... this.state = { count: props.initValue || 0 } }
注意:使用React.createClass方法建立出來的組件類,經過getInitialState方法獲取初始值,但這種方法已被廢棄。
讀取和更新state
this.state
this.setState({})
注意:不要直接修改this.state的值,雖然可以改變組件的內部狀態,但只是野蠻的修改了state,卻不會驅動組件重新渲染,因此變化不會反應到界面
而,this.setState()
所作的事是先改變this.state
的值,而後驅動組件更新
prop和state對比
使用context能夠實現跨級傳遞。
context使用步驟
eg:
父組件
class Parent extends React.Component{ getChildContext(){ return {color: "red"} } render(){ return( <div> <Child /> </div> ) } } Parents.childContextTypes = { color: PropTypes.string.isRequired }
(有狀態)子組件:
class Child extends React.Component{ render(){ return( <div> <p style = {{color:{this.context.color}}}>有狀態的組件能夠經過this.context獲取</p> <Grandchild /> </div> ) } } Child.contextTypes = { color: PropTypes.string.isRequired }
(無狀態)孫子組件:
function Grandchild(context){ return( <p style = {{color: {context.color}}}>無狀態組件能夠直接在函數的參數中獲取</p> ) } Grandchild.contextTypes = { color:PropTypes.string.isRequired }
不積跬步,何以行千里