zoukankan      html  css  js  c++  java
  • 我的第一个React自定义组件

    今天随便翻了一下antd的组件库,看到下面这样的组件,当时我就震惊了:

    这尼玛,这是出于什么样的考虑,一个列表还要用户编写子项的渲染方式。

    所以,我就自己写了一个

    List.js:

    List.less:

    index.js:

    效果:

    当然,可以根据需要添加更多的事件以及对其他数据格式的支持。

    自个儿写了个Input输入框组件:

    X_UI.js:

    import React, { Component } from 'react';
    import './X_UI.less';
    
    
    /*输入框*/
    export class Input extends Component {
        constructor(props) {
            super(props);
            this.state = {
                value:props.value,
            }
        }
        /*双向数据绑定更新父组件*/
        onchange = (e)=>{
            var value = e.target.value;
            this.setState({
                value:value
            });
            if(this.props.onChange){
                this.props.onChange(value);
            }
        }
        /*双向数据绑定更新子组件*/
        componentWillReceiveProps = (nextProps) => {
          this.setState({
            value:nextProps.value,
          })    
        }
        render() {
            console.log(this.props.size);
            var style;
            switch (this.props.size){
                case 'large':
                    style={
                        height:'36px',
                        inlineHeight:'36px',
                        fontSize:'18px'
                    }
                    break;
                case 'small':
                    style={
                        height:'24px',
                        inlineHeight:'24px',
                        fontSize:'12px'
                    }
                    break;
                default:
                    style={
                        height:'30px',
                        inlineHeight:'30px',
                        fontSize:'15px'
                    }
                    break;
            }
            //与props.style属性合并
            style = Object.assign(this.props.style||{},style)
            var placeholder = this.props.placeholder||'请输入...';
            return (
                <div className="x_input">
                    <input placeholder={placeholder} style={style} onChange={this.onchange} value={this.state.value}></input>
                </div>
                );
        }
    }

    X_UI.less:

    @gray:rgb(197,197,197);
    @blue:rgb(51,153,255);
    
    input::-webkit-input-placeholder{
      color:@gray !important;
    }
    input::-moz-placeholder{
      color:@gray !important;
    }
    input:-ms-input-placeholder {
      color:@gray !important;
    }   
    
    .x_input{
        >input{
          border:1px solid @gray;
          padding:2px 6px;
          border-radius:4px;
        }
        >input:hover{
            border:1px solid @blue;
        }
        >input:focus{
            border:1px solid transparent;
            box-shadow:0 0 3px 1px @blue;
            outline:none
        }
    }

    App.js:

    import React, { Component } from 'react';
    import {Input} from '../../components/X_UI'
    import './App.less';
    
    export class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          value:'hello'
        };
      }
      change=(value)=>{
        this.setState({
          value:value
        })
      }
      render() {
        return (
          <div className="app"> 
            <Input size="small" value={this.state.value} onChange={this.change} />
            {this.state.value}
            <button onClick={this.change.bind(this,'world')}>Click</button>
          </div>
        );
      }
    }

    效果:

  • 相关阅读:
    “无法更新EntitySet“*****”,因为它有一个DefiningQuery,而元素中没有支持当前操作的元素”问题的解决方法
    Web.Config全攻略
    C#常用的正则
    Asp.Net MVC2 Json
    webservice+Jquery返回Json格式【原创】
    JAVA线程池介绍以及简单实例
    从程序员到项目经理(17):你不是一个人在战斗思维一换天地宽
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    多表对应更新(跨服务器).sql
    sql导出excel.sql
  • 原文地址:https://www.cnblogs.com/eco-just/p/10569155.html
Copyright © 2011-2022 走看看