React.js函数组件基本使用

函数组件基本使用

React 的函数组件是 React 组件的一种形式,它们是无状态的(stateless),并且只接收 props 作为输入,然后返回 JSX。从 React 16.8 开始,引入了 Hooks API,这使得函数组件也能具有类似于类组件的 state 和其他功能。

1、基本使用

<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        let TestDemo=()=>{
            return (
                <div>hello world</div>
            )
        }
        let element = (
            <TestDemo />
        )
        root.render(element)
    </script>
</body>

2、传递参数(props)

<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        let TestDemo = (props) => {
            return (
                <div>{props.count}</div>
            )
        }
        TestDemo.defaultProps = {
            count: 0
        }
        let element = (
            <TestDemo count={5} />
        )
        root.render(element)
    </script>
</body>
  • defaultProps

在函数组件中,不能直接在组件函数上定义 defaultProps,但可以使用 ES6 模块的默认参数或者在组件外部定义一个对象来模拟 defaultProps 的功能。

<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        let TestDemo=(props)=>{
            return (
                <div>{props.count}</div>
            )
        }
        TestDemo.defaultProps={
            count: 0
        }
        let element = (
            <TestDemo count={5}/>
        )
        root.render(element)
    </script>
</body>

3、定义类型检查(propTypes)

也可以使用 PropTypes 库(来自 prop-types 包)来为函数组件的 props 定义类型检查。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/react@18.3/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18.3/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/babel-standalone@6.26.0/babel.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prop-types/15.6.0/prop-types.js"></script>
    <style>
        .wrapper {
            background: pink;
        }
    </style>
</head>
<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        let TestDemo=(props)=>{
            return (
                <div>{props.count}</div>
            )
        }
        TestDemo.propTypes={
            count: PropTypes.number
        }
        let element = (
            <TestDemo count={5}/>
        )
        root.render(element)
    </script>
</body>
</html>

4、事件处理

<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        let TestDemo=(props)=>{
            const handleClick=(event)=>{
                console.log(event)
            }
            return (
                <div>
                    <div>{props.count}</div>
                    <button onClick={handleClick}>点击</button>
                </div>
            )
        }
        let element = (
            <TestDemo count={0}/>
        )
        root.render(element)
    </script>
</body>

5、组件嵌套在对象中

无论是函数组件还是类组件,都可以实现嵌套函数组件和类组件

<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        const TestDemo = {
            // 类组件
            Child1Demo: class extends React.Component {
                render() {
                    return (
                        <div>0</div>
                    )
                }
            },
            // 函数组件
            Child2Demo: () => {
                return (
                    <button>点击</button>
                )
            }
        }
        let element = (
            <React.Fragment>
                <TestDemo.Child1Demo />
                <TestDemo.Child2Demo />
            </React.Fragment>
        )
        root.render(element)
    </script>
</body>

6、<React.Fragment><Context.Provider>

解决特定问题的组件

  • <React.Fragment>

<React.Fragment>用于在返回多个元素的组件中,避免创建一个额外的 DOM 元素包裹它们。相当于Vue中的template

<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        let TestDemo=(props)=>{
            return (
                 <React.Fragment>
                    <div>{props.count}</div>
                 </React.Fragment>
            )
        }
        let element = (
            <TestDemo count={0}/>
        )
        root.render(element)
    </script>
</body>
  • <Context.Provider>

<Context.Provider> 是 React 的 Context API 的一部分,它允许在组件树中不必显式地逐层传递 props,就可以让深层的组件访问到某个值。Context 提供了一种在组件之间共享值的方式,而不必显式地通过每一层的 props 传递。如下是一个简单加法示例,后面会详细解释React函数

<body>
    <div id="app"></div>
    <script type="text/babel">
        let app = document.querySelector('#app')
        let root = ReactDOM.createRoot(app);
        let { useState,useContext, createContext } = React
        const defaultValue = { count: 0, setValue: () => { } };
        const MyContext = createContext(defaultValue);
        const TestDemo = () => {
            const [count, setCount] = useState(0);
            return (
                <MyContext.Provider value={{ count, setCount }}>
                    <ChildDemo />
                </MyContext.Provider>
            )
        }
        const ChildDemo=()=>{
            const { count, setCount } = useContext(MyContext);
            return (
                <div>
                    <p>{count}</p>
                    <button onClick={() => setCount(count +1)}>按钮</button>
                </div>
            );
        }
        let element = (
            <div>
                <TestDemo/>
            </div>
        )
        root.render(element)
    </script>
</body>
#牛客创作赏金赛##前端##react#
全部评论

相关推荐

不愿透露姓名的神秘牛友
04-22 18:57
点赞 评论 收藏
分享
希望有个offer吧:博士会要这点钱?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务