2018-12-29
render props模式 #积累/react
Render Props - React
基础用法 传入RenderAll的子组件是个函数; 该函数会在RenderAll组件中传入参数,并执行。
1 2 3 4 5 6 7 8 9 10 11 <RenderAll> {() => <h1>hello world</h1>} </RenderAll> const RenderAll = (props) => { return( <React.Fragment> {props.children(props)} </React.Fragment> ); };
props.children不一定非得在render函数中执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function Repeat(props) { let items = []; for (let i = 0; i < props.numTimes; i++) { items.push(props.children(i)); } return <div>{items}</div>; } function ListOfTenThings() { return ( <Repeat numTimes={10}> {(index) => <div key={index}>This is item {index} in the list</div>} </Repeat> ); }
控制props 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 const Login = (props) => { const userName = getUserName(); if (userName) { const allProps = {userName, ...props}; return ( <React.Fragment> {props.children(allProps)} </React.Fragment> ); } else { return null; } }; <Login> {({userName}) => <h1>Hello {userName}</h1>} </Login>
不局限于children 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 const Auth= (props) => { const userName = getUserName(); if (userName) { const allProps = {userName, ...props}; return ( <React.Fragment> {props.login(allProps)} </React.Fragment> ); } else { <React.Fragment> {props.nologin(props)} </React.Fragment> } }; <Auth login={({userName}) => <h1>Hello {userName}</h1>} nologin={() => <h1>Please login</h1>} />