React——组件的三大核心属性【七】

简介: React——组件的三大核心属性【七】

前言

组件的三大核心属性

内容

state

定义一个展示天气信息组件,通过点击切换天气信息

理解

  1. state是组件对象最重要的属性,值是对象(可以包含多key-value组合)
  2. 组件被称为状态机,通过更新组件的state来重新渲染组件
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test">
</div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
//1. 创建组件
class Weather extends React.Component {
    //调用1次
    constructor(props) {
        super(props);
        //初始化状态
        this.state = { isHot: true };
        //解决changeWeather的指向问题
        this.changeWeather = this.changeWeather.bind(this)
    }
    //调用次数1+n 1是初始化,n是状态更新
    render() {
        console.log(this)
        //读取状态
        const {isHot} = this.state
        return (
            <div>
               <h1 onClick={this.changeWeather}>今天天气 {isHot ? '热热' : '不热热'}</h1>
            </div>
        );
    }
    //点击几次调用几次
    changeWeather(){
        //状态不可直接更改需要借助内置方法(setState)进行更改
        const isHot = this.state.isHot
        this.setState({isHot:!isHot})
    }
}
//2.渲染组件到页面
ReactDOM.render(<Weather/>,document.getElementById('test'))
</script>
</body>
</html>

简写

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test">
</div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
//1. 创建组件
class Weather extends React.Component {
    
    render() {
        const {isHot} = this.state
        return (
            <div>
               <h1 onClick={this.changeWeather}>今天天气 {isHot ? '热热' : '不热热'}</h1>
            </div>
        );
    }
    //赋值语句+箭头函数
    changeWeather = () => {
        const isHot = this.state.isHot
        this.setState({isHot:!isHot})
    }
}
//2.渲染组件到页面
ReactDOM.render(<Weather/>,document.getElementById('test'))
</script>
</body>
</html>

注意点

1. 组件中的render方法中的this为组件实例对象
2. 组件中自定义的方法中的为undefined,如何解决?
   2.1 前置绑定this:通过函数对象的bind()
   2.2 赋值语句+箭头函数
3. 状态数据,不能直接修改或更新,需通过setState来变更

props

自定义用来显示一个人员信息的组件

  1. 姓名必须指定,且为字符串类型;
  2. 性别为字符串类型,如果性别没有指定,默认为男
  3. 年龄为字符串类型,且为数字类型,默认值为18

理解

  1. 每个组件对象都会有props(properties)属性
  2. 组件标签的所有属性都保存在props中
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<div id="test1"></div>
<div id="test2"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<!--引入prop-types,用于对组件标签属性进行限制-->
<script type="text/javascript" src="../js/prop-types.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
//1. 创建组件
class Person extends React.Component {
    render() {
        //props是只读的,不可进行修改
        const {name,age,sex} = this.props
        return (
            <div>
                <ul>
                    <li>姓名:{name}</li>
                    <li>年龄:{age}</li>
                    <li>性别:{sex}</li>
                </ul>
            </div>
        );
    }
}
//对标签属性进行类型,必要性限制
Person.protoType = {
    name: PropTypes.string.isRequired, // 限制name必传且类型为string
    age: PropTypes.number,
    sex: PropTypes.string,
    speak: PropTypes.func
}
//指定默认标签属性值
Person.defaultProps = {
    sex: "男",
    age: 18
}
function speak() {
    return "哈哈哈哈"
}
//2.渲染组件到页面
const p = {name:"张三", age:66, sex:'男'}
ReactDOM.render(<Person name="tom" age={19} sex="男" speak={speak}/>,document.getElementById('test'))
ReactDOM.render(<Person name="jim" age="10" sex="男"/>,document.getElementById('test1'))
//语法糖
ReactDOM.render(<Person {...p}/>,document.getElementById('test2'))
</script>
</body>
</html>

简写

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<div id="test1"></div>
<div id="test2"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<!--引入prop-types,用于对组件标签属性进行限制-->
<script type="text/javascript" src="../js/prop-types.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
//1. 创建组件
class Person extends React.Component {
    // constructor(props) {
    //     //构造器是否接收props,是否传递给super,取决于:是否希望在构造器中通过this访问props
    //     super(props);
    // }
    //对标签属性进行类型,必要性限制
    static protoType = {
        name: PropTypes.string.isRequired, // 限制name必传且类型为string
        age: PropTypes.number,
        sex: PropTypes.string
    }
    //指定默认标签属性值
    static defaultProps = {
        sex: "男",
        age: 18
    }
    render() {
        //props是只读的,不可进行修改
        const {name,age,sex} = this.props
        return (
            <div>
                <ul>
                    <li>姓名:{name}</li>
                    <li>年龄:{age}</li>
                    <li>性别:{sex}</li>
                </ul>
            </div>
        );
    }
}
ReactDOM.render(<Person name="tom" />,document.getElementById('test'))
</script>
</body>
</html>

函数式组件使用props

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<div id="test1"></div>
<div id="test2"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<!--引入prop-types,用于对组件标签属性进行限制-->
<script type="text/javascript" src="../js/prop-types.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
//1. 创建组件
function Person(props) {
    const {name, age, sex} = props
    return (
        <div>
            <ul>
                <li>姓名:{name}</li>
                <li>年龄:{age}</li>
                <li>性别:{sex}</li>
            </ul>
        </div>
    )  ;
}
    //对标签属性进行类型,必要性限制
     Person.protoType = {
        name: PropTypes.string.isRequired, // 限制name必传且类型为string
        age: PropTypes.number,
        sex: PropTypes.string
    }
    //指定默认标签属性值
     Person.defaultProps = {
        sex: "男",
        age: 18
    }
ReactDOM.render(<Person name="tom" sex="女" age={18}/>,document.getElementById('test'))
</script>
</body>
</html>

注意点

1. 通过标签属性从组件外向组件内传递变化的数据
2. 注意: 组件内部不要修改props数据
3. 内部通过this.props.xx读取某个属性值
4. props中的属性值进行类型限制和必要性限制
   4.1 React v15.5 开始已弃用
        Person.propTypes = {
         name: React.PropTypes.string.isRequired,
         age: React.PropTypes.number
        }
   4.2 使用prop-types库进限制(需要引入prop-types库)
       Person.propTypes = {
        name: PropTypes.string.isRequired,
        age: PropTypes.number. 
       }
5. 扩展属性: 将对象的所有属性通过props传递
   <Person {...person}/>
6. 默认属性值
   Person.defaultProps = {
    age: 18,
    sex:'男'
   }

ref

  1. 点击按钮, 提示第一个输入框中的值
  2. 当第2个输入框失去焦点时, 提示这个输入框中的值

理解

组件内的标签可以定义ref属性来标识自己

字符串类型ref

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
class Demo extends React.Component {
    //左侧
    showData = () => {
        const { input1 } = this.refs
        alert(input1.value)
    }
    //右侧
    showData2 = () => {
        const { input2 } = this.refs
        alert(input2.value)
    }
    render() {
        return (
            <div>
                <input ref="input1" type="text" placeholder="点击按钮提示数据"/> &nbsp;
                <button  onClick={this.showData}>点我提示左侧数据</button>
                <br/>
                <hr/>
                <input onBlur={this.showData2} ref="input2" type="text" placeholder="失去焦点提示数据"/>
            </div>
        );
    }
}
ReactDOM.render(<Demo/>, document.getElementById("test"))
/**
 * string类型的ref是过时的API
 * https://react.docschina.org/docs/refs-and-the-dom.html#legacy-api-string-refs
 *
 * https://github.com/facebook/react/pull/8333#issuecomment-271648615
 */
</script>
</body>
</html>

回调函数类型ref

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
class Demo extends React.Component {
    //左侧
    showData = () => {
        const {input1} = this
        alert(input1.value)
    }
    //右侧
    showData2 = () => {
        const {input2} = this
        alert(input2.value)
    }
    render() {
        return (
            <div>
                <input ref={currentNode => this.input1 = currentNode} type="text" placeholder="点击按钮提示数据"/> &nbsp;
                <button  onClick={this.showData}>点我提示左侧数据</button>
                <br/>
                <hr/>
                <input  ref={currentNode => this.input2 = currentNode} onBlur={this.showData2}  type="text" placeholder="失去焦点提示数据"/>
            </div>
        );
    }
}
ReactDOM.render(<Demo />, document.getElementById("test"))
</script>
</body>
</html>

如果 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
class Demo extends React.Component {
    state = {isHot:true}
    changeWeather = () => {
        const {isHot} = this.state
        this.setState({isHot:!isHot})
    }
    //左侧
    showData = () => {
        const {input1} = this
        alert(input1.value)
    }
    saveInput = (c) => {
        this.input1 = c;
        console.log('@',c);
    }
    render() {
        const {isHot} = this.state
        return (
            <div>
                <h2>今天天气很{isHot ? '炎热' : '凉爽'}</h2>
                <button onClick={this.changeWeather}>点击切换天气</button>
                {/*<input ref={(currentNode) => { this.input1 = currentNode; console.log('@',currentNode);} }  type="text" placeholder="点击按钮提示数据"/> &nbsp;*/}
                <input ref={this.saveInput}  type="text" placeholder="点击按钮提示数据"/> &nbsp;
                <button  onClick={this.showData}>点我提示左侧数据</button>
            </div>
        );
    }
}
ReactDOM.render(<Demo />, document.getElementById("test"))
</script>
</body>
</html>

createRef

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
class Demo extends React.Component {
    // React.createRef调用后可以返回一个容器,该容器可以存储被ref所标识的节点,该容器是专人专用的
    myRef = React.createRef()
    myRef2 = React.createRef()
    //左侧
    showData = () => {
        alert(this.myRef.current.value)
    }
    //右侧
    showData2 = () => {
        alert(this.myRef2.current.value)
    }
    render() {
        return (
            <div>
                <input ref={this.myRef} type="text" placeholder="点击按钮提示数据"/> &nbsp;
                <button  onClick={this.showData}>点我提示左侧数据</button>
                <input onBlur={this.showData2} ref={this.myRef2} type="text" placeholder="=失去焦点显示数据"/> &nbsp;
            </div>
        );
    }
}
ReactDOM.render(<Demo />, document.getElementById("test"))
</script>
</body>
</html>

注意点

1.  string类型的ref是过时的API,可能会在未来版本被移除,建议使用回调函数或createRef API来代替。
    <input ref="input1"/>
2. 回调函数类型的ref
   <input ref={(c)=>{this.input1 = c}} />
   2.1 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素
       <input ref={this.saveInput} /> //通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题
3. createRef创建ref容器
   myRef = React.createRef() 
   <input ref={this.myRef}/>

事件处理

1.通过onXxx属性指定事件处理函数(注意大小写)
  1) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件___兼容性
  2) React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)___高效性
2.通过event.target得到发生事件的DOM元素对象___不要过度使用ref
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<!--创建"容器"-->
<div id="test"></div>
<!--引入react核心库-->
<script type="text/javascript" src="../js/react.development.js"></script>
<!--引入react-dom,用于支持react操作DOM-->
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<!--引入babel,用于将jsx转js-->
<script type="text/javascript" src="../js/babel.min.js"></script>
<script type="text/babel">/*一定要以text/babel来声明*/
class Demo extends React.Component {
    /**
     1. 通过onXxx属性指定事件处理函数(注意大小写)
         1) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件___兼容性
         2) React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)___高效性
     2. 通过event.target得到发生事件的DOM元素对象___不要过度使用ref
     *
     */
    // 创建ref容器
    myRef = React.createRef()
    myRef2 = React.createRef()
    //左侧
    showData = () => {
        alert(this.myRef.current.value)
    }
    //右侧
    showData2 = (event) => {
        alert(event.target.value)
    }
    render() {
        return (
            <div>
                <input ref={this.myRef} type="text" placeholder="点击按钮提示数据"/> &nbsp;
                <button  onClick={this.showData}>点我提示左侧数据</button>
                <input onBlur={this.showData2} type="text" placeholder="=失去焦点显示数据"/> &nbsp;
            </div>
        );
    }
}
ReactDOM.render(<Demo />, document.getElementById("test"))
</script>
</body>
</html>

学无止境,谦卑而行.

目录
相关文章
|
7天前
|
移动开发 前端开发 API
React 音频播放器组件 Audio Player
本文介绍如何使用React创建音频播放器组件,涵盖核心功能如播放/暂停、进度条、音量控制和时间显示。通过HTML5 `&lt;audio&gt;` 元素和React的声明式状态管理,实现交互式音频播放。常见问题包括控件不响应、进度条无法更新和音量控制失灵,并提供解决方案。此外,还讨论了浏览器兼容性、异步错误处理和性能优化等易错点及避免方法。
320 123
|
19天前
|
移动开发 前端开发 JavaScript
React 视频播放控制组件 Video Controls
本文介绍了如何使用 React 构建视频播放控制组件(Video Controls),涵盖基本概念、创建步骤和常见问题解决。首先,通过 HTML5 `&lt;video&gt;` 标签和 React 组件化思想,实现播放/暂停按钮和进度条等基础功能。接着,详细讲解了初始化项目、构建 `VideoControls` 组件及与主应用的集成方法。最后,针对视频无法播放、控制器状态不同步、进度条卡顿和音量控制失效等问题提供了具体解决方案,并介绍了全屏播放和自定义样式等进阶功能。希望这些内容能帮助你在实际项目中更好地实现和优化视频播放功能。
95 40
|
5天前
|
移动开发 前端开发 UED
React 音频预览组件 Audio Preview
在现代Web开发中,React框架下的音频播放功能日益重要。本文介绍如何使用React创建交互式音频预览组件,涵盖基础构建、常见问题及解决方案。通过HTML5音频标签实现基本播放控制,使用状态管理增强功能。解决跨域资源共享(CORS)、格式兼容性、自动播放限制等问题,并探讨性能优化、样式定制、事件处理、移动端适配、错误处理、国际化支持及组件集成等关键点,帮助开发者提升组件稳定性和用户体验。
23 10
|
1月前
|
存储 编解码 前端开发
React 视频上传组件 Video Upload
随着互联网的发展,视频内容在网站和应用中愈发重要。本文探讨如何使用React构建高效、可靠的视频上传组件,涵盖基础概念、常见问题及解决方案。通过React的虚拟DOM和组件化开发模式,实现文件选择、进度显示、格式验证等功能,并解决跨域请求、并发上传等易错点。提供完整代码案例,确保用户能顺畅上传视频。
135 92
|
1月前
|
前端开发 UED 索引
React 图片灯箱组件 Image Lightbox
图片灯箱组件是一种常见的Web交互模式,用户点击缩略图后弹出全屏窗口展示大图,并提供导航功能。本文介绍了基于React框架的图片灯箱组件开发,涵盖初始化状态管理、图片加载与预加载、键盘和鼠标事件处理等常见问题及解决方案。通过`useState`和`useEffect`钩子管理状态,使用懒加载和预加载优化性能,确保流畅的用户体验。代码案例展示了组件的基本功能实现,包括打开/关闭灯箱、切换图片及键盘操作。
132 80
|
1月前
|
移动开发 前端开发 JavaScript
React 图片裁剪组件 Image Cropper
本文介绍了在React中实现图片裁剪功能的方法,涵盖基础知识、常见问题及解决方案。首先,通过第三方库如`react-image-crop`或`cropperjs-react`可轻松实现图片裁剪。接着,针对性能和兼容性问题,提供了优化图片加载、处理裁剪区域响应慢、解决浏览器差异等方案。最后,通过代码案例详细解释了如何创建一个基本的图片裁剪组件,并提出了优化建议,如使用`React.memo`、添加样式支持及处理大图片预览,帮助开发者避免常见错误并提升用户体验。
130 67
|
7天前
|
缓存 前端开发 JavaScript
React 视频弹幕组件 Video Danmaku
视频弹幕(Danmaku)是在线视频平台中实时显示用户评论的方式,增强互动体验。本文介绍如何在React中实现视频弹幕组件,涵盖基本结构、常见问题及解决方案,如避免弹幕重叠、优化性能、确保同步等,并通过代码示例详细解释。帮助开发者解决样式不一致、输入验证不足和加载延迟等问题,提供实用参考。
48 20
|
14天前
|
移动开发 前端开发 UED
React 音频预览组件:Audio Preview
本文介绍如何使用 React 构建音频预览组件,涵盖基础实现、常见问题及解决方案。通过 HTML5 `&lt;audio&gt;` 标签和 React 状态管理,实现播放控制。解决文件路径、浏览器兼容性等问题,并优化性能,避免状态不同步和内存泄漏,提升用户体验。
59 22
|
2月前
|
前端开发 UED 开发者
React 悬浮按钮组件 FloatingActionButton
悬浮按钮(FAB)是常见的UI元素,用于提供突出的操作。本文介绍如何在React中使用Material-UI创建美观的FAB组件,涵盖基本概念、实现方法及常见问题解决。通过代码示例和优化技巧,帮助开发者提升用户体验,确保按钮位置、颜色、交互反馈等方面的表现,同时避免无障碍性和性能问题。
139 80
|
9天前
|
移动开发 前端开发 JavaScript
React 视频播放控制组件 Video Controls
本文深入探讨了如何使用React创建功能丰富的视频播放控制组件(Video Controls)。首先介绍了React与HTML5 `&lt;video&gt;` 标签的基础知识,展示了如何通过状态管理和事件处理实现自定义控件。接着分析了常见问题如视频加载失败、控件样式不一致、状态管理混乱和性能问题,并提供了相应的解决方案。最后通过完整代码案例详细解释了播放、暂停、进度条和音量控制的实现方法,帮助开发者在React中构建高质量的视频播放组件。
45 17