主题
Props
基本使用
注意事项:
- props 可以传递任意数据:字符串、数字、布尔值、数组、对象、函数、JSX。
- 必须遵循 单向数据流,子组件只能读取 props 中的数据,不能直接修改!
jsx
const App = () => {
return (
<>
<Son
name="小明"
age={18}
isTrue={true}
list={[1, 2, 3]}
obj={{ a: 1, b: 2 }}
onFn={(msg) => {
console.log(msg)
}}
el={<div>小明</div>}
>
<div>default</div>
</Son>
</>
)
}jsx
const Son = (props) => {
console.log(props)
return <div onClick={() => props.onFn('son')}>子组件</div>
}prop-types
prop-types 是一个用于类型检查的库,可以帮助开发者在开发过程中捕获错误,确保组件接收到正确类型的 props。
安装
bash
npm i prop-types使用
tsx
import PropTypes from 'prop-types'
interface PropsType {
name: string
sex: string
age: number
}
function Card(props: PropsType) {
const { name, sex, age } = props
return (
<div>
<p>姓名:{name}</p>
<p>性别:{sex}</p>
<p>年龄:{age}</p>
</div>
)
}
Card.propTypes = {
name: PropTypes.string.isRequired,
sex: PropTypes.string,
age: PropTypes.number,
}
Card.defaultProps = {
sex: '男',
age: 18,
}
export default CardEmit
提示
可类比于 vue 中的 emit。
jsx
import { useState } from 'react'
import AnswerButton from './AnswerButton'
function App() {
const [isHappy, setIsHappy] = useState(true)
const onAnswerNo = () => {
setIsHappy(false)
}
const onAnswerYes = () => {
setIsHappy(true)
}
return (
<>
<p>Are you happy?</p>
<AnswerButton onYes={onAnswerYes} onNo={onAnswerNo} />
<p style={{ fontSize: 50 }}>{isHappy ? '😀' : '😥'}</p>
</>
)
}
export default Appjsx
function AnswerButton({ onYes, onNo }) {
return (
<>
<button onClick={onYes}>YES</button>
<button onClick={onNo}>NO</button>
</>
)
}
export default AnswerButtonSlot
提示
可类比于 vue 中的 slot。
children
当把内容嵌套在子组件标签中时,父组件会自动在名为 children 的属性中传递进来。
jsx
const App = () => {
return (
<Son>
<div>小明</div>
</Son>
)
}jsx
function Son(props) {
return <div>{props.children}</div>
}直接传递 JSX
jsx
const App = () => {
return <Card header="标题" body="内容" footer="底部" />
}jsx
const Card = (props) => {
return (
<div>
<div className="header">{props.header}</div>
<div className="body">{props.body}</div>
<div className="footer">{props.footer}</div>
</div>
)
}