React 自定义组件与组件复用

本文探讨了如何在React中实现组件的自定义和复用,强调了通过维护状态(state)来管理和处理数据,以提升组件的灵活性和重用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不可控组件和可控组件
     
  不可控组件使用方式:
      
<span style="font-size:18px;"><input type="text" defaultValue="hello world"/>
      React.findDomNode(this.ref.input).value</span>

可控组件使用方式:
      
<input type="text" defaultValue={this.state.text}/>
      var inputText=this.state.text;

组件可控的好处:
  1.              符合React的数据流
  2.        数据存储在state中,便于使用
  3.        便于对数据进行处理
不可控组件实例
 var MyForm=React.createClass({
       handleSubmit:function(event){
           event.preventDefault();
           var helloTo=ReactDOM.findDOMNode(this.refs.helloTo).value;
           alert(helloTo);
       },
        render:function(){
            return <form onSubmit={this.handleSubmit}>
                <input  type="text" ref="helloTo" defaultValue="Hello World"/><br/>
                <button type="submit" >Speak</button>
            </form>
        }
    });

    ReactDOM.render(<MyForm/>,document.getElementById("app"));

可控组件实例:

var MyForm=React.createClass({
       getInitialState:function(){
           return {
               helloTo:"hello world"
           }
       },
        handleSubmit:function(event){
            event.preventDefault();
            alert(this.state.helloTo);
        },
        handleChange:function(event){
            this.setState({helloTo:event.target.value});
        },
        render:function(){
            return <form onSubmit={this.handleSubmit} >
                <input type="text" value={this.state.helloTo} onChange={this.handleChange}/>
                <button type="submit">submit</button>
            </form>
        }

    });
    ReactDOM.render(<MyForm/>,document.getElementById("app"));

复用事件处理函数

事件处理函数的两种复用方式:
 1 bind复用
      
handleChange:function(name,event){}
      onChange={this.handleChange.bind(this,"input1")}

 2 name复用
     
handleChange:function(event){
       var name=event.target.name;
      }
      onChange={this.handleChange}

bind组件复用实例
 var MyForm=React.createClass({
        getInitialState:function(){
            return{
                username:"",
                gender:"man",
                checked:true
            }
        },
        handleChange:function(name,event){
            var newState={};
            newState[name]=name=="checked"?event.target.checked:event.target.value;
            this.setState(newState);
        },
        handleSubmit:function(event){
            event.preventDefault();
            console.log(this.state);
        },
        render:function(){
            return <form onSubmit={this.handleSubmit}>
                <input type="text" onChange={this.handleChange.bind(this,"username")}/><br/>
                <select value={this.state.gender} onChange={this.handleChange.bind(this,"gender")}>
                    <option value="1">男</option>
                    <option value="2">女</option>
                </select><br/>
                <label htmlFor="checkbox">同意用户协议</label>
                <input id="checkbox" type="checkbox"  value="agree" checked={this.state.checked}
                       onChange={this.handleChange.bind(this,"checked")}
                /><br/>
                <button type="submit">submit</button>
            </form>
        }

    });
    ReactDOM.render(<MyForm/>,document.getElementById("app"));

name组件复用实例
     
      var MyForm=React.createClass({
        getInitialState:function(){
            return{
                username:"",
                gender:"man",
                checked:true
            }
        },
        handleChange:function(event){
            var name=event.target.name;
            var newState={};
            newState[name]=name=="checked"?event.target.checked:event.target.value;
            this.setState(newState,null);
        },
        handleSubmit:function(event){
            event.preventDefault();
            console.log(this.state);
        },
        render:function(){
            return <form onSubmit={this.handleSubmit}>
                <input type="text" onChange={this.handleChange} name="username"/><br/>
                <select value={this.state.gender} onChange={this.handleChange} name="gender">
                    <option value="1">男</option>
                    <option value="2">女</option>
                </select><br/>
                <label htmlFor="checkbox">同意用户协议</label>
                <input id="checkbox" type="checkbox"  value="agree" checked={this.state.checked}
                       onChange={this.handleChange} name="checked"
                /><br/>
                <button type="submit">submit</button>
            </form>
        }

    });
    ReactDOM.render(<MyForm/>,document.getElementById("app"));




### 创建 React 自定义组件 #### 3.1 自定义组件设计原则 在构建复杂的用户界面时,自定义组件能够显著提升代码的可维护性和复用性。为了确保组件的有效性和高效性,在设计阶段应遵循一些基本原则[^1]。 - **单一职责原则**:每个组件应该只负责一个功能或表示一部分UI。 - **高内聚低耦合**:保持组件内部紧密联系的同时减少其他部分之间的依赖关系。 - **易于测试**:编写容易单元测试的小型独立模块化部件。 #### 实现简单函数式组件 对于较为简单的场景,可以直接采用函数的形式来声明组件: ```javascript function Welcome(props) { return <h1>Hello, {props.name}</h1>; } ``` 此段代码展示了最基础形式下的函数式组件定义方法——接受`props`作为参数并返回JSX结构[^3]。 #### 添加样式支持 React提供了多种方式用于处理CSS样式表单应用到组件上: - 使用内联样式的对象字面量语法; - 利用外部CSS文件并通过className属性关联特定的选择器名称; - 借助第三方库如Styled Components实现更加灵活强大的主题定制能力[^4]. 以下是利用styled-components的例子: ```jsx import styled from 'styled-components'; const Title = styled.h1` font-size: 1.5em; text-align: center; `; function App() { return ( <Title>Welcome to the future of CSS-in-JS</Title> ); } ``` #### 处理事件状态管理 当涉及到交互行为或是动态数据展示的时候,则可能需要用到类(Class-Based Component) 或者 Hook(Functional Component with Hooks),以便更好地管理和响应用户的操作以及应用程序的状态变化。 例如,使用useState hook 来追踪按钮点击次数: ```jsx import React, { useState } from "react"; function CounterButton({ initialCount }) { const [count, setCount] = useState(initialCount); function handleClick(){ setCount(prevCount => prevCount + 1); } return ( <button onClick={handleClick}> Clicked {count} times </button> ) } ``` 上述例子中不仅实现了基本的功能需求,同时也体现了良好的编码习惯和最佳实践[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值