• react小经验总结


    编写习惯

    如上图
    1 命名:以name-subname.js命名
    2 暴露组件命名: 以文件命名为基础,NameSubname
    3 根标签给到的<div>,给定一个className并以文件名命名,
      className="name-subname"。这样做是方便在less里面写样式,
      直接在.name-subname{ }里面写本页面的样式,和其他页面互不影响
    4 页面的组件部分,以jsx后缀,页面部分,以js后缀。好区分,也可以以大小写命名来区分,组件一般大写命名。
    

    日期选择组件设置为中文

    import zh_CN from 'antd/lib/locale-provider/zh_CN';
    import 'moment/locale/zh-cn';
    import {LocaleProvider} from 'antd'   
    
    
    <LocaleProvider locale={zh_CN}>   //在日期组件外面包裹此标签
            <RangePicker
              showTime={{format:"HH:mm"}}
              format="YYYY-MM-DD HH:mm"
              placeholder={["开始时间","结束时间"]}
              onChange={onChange}
              onOk={onOk}
             />
     </LocaleProvider>
    

    form表单需要额外Form.create并且暴露组件

    class ModalForm extends React.Component {   //这里不要暴露(export default)组件
          
          render (){
              const { getFieldDecorator } = this.props.form;
              return (
                  <div className="formdemo">
                        <Form onSubmit={this.handleSubmit} {...FormStyle}>
                        <Form.Item label="联系人" className="mb-10px">
                            {getFieldDecorator('linkman',{
                                rules:[{
                                    required:true,
                                    message:"请输入联系人"
                                    }]
                                })(<Input placeholder="请输入联系人" />)}
                        </Form.Item>
                        <Form.Item label="客户需求" className="mb-10px">
                            {getFieldDecorator("clientneed",{
                                rules:[{required:true}]
                            })(
                                <TextArea placeholder="请输入客户需求/备注" style={{resize:"none"}}/>
                            )}
                        </Form.Item>
                    </Form>
                  </div>
                );
          }
    }
    
    const ModalForm1 = Form.create({})(ModalForm);   //这里用Form.create({}),并且暴露组件
    export default ModalForm1;
    

    表格在export defult class ...内部使用

    import React from 'react';
    import 'comp.less';
    import {Table} from 'antd';
    
    const data=[{    
        key: "1",
        name:"亚索",
        age:"18",
        sex:"男",
        weight:"60kg",
    },{
        key: "1",
        name:"剑姬",
        age:"19",
        sex:"女",
        weight:"60kg",
    }]
    
    export default class TableDemo extends React.Component{
        constructor(props){
            super(props);
            this.columns=[       //this.columns 写在构造器里
                {title:"姓名",dataIndex:"name"},
                {title:"年龄",dataIndex:"age"},
                {title:"性别",dataIndex:"sex"},
                {title:"体重",dataIndex:"weight"},
                {
                title:"爱好",
                key:"like",
                render:()=>(     //如果表格里需要插入html元素或者其他复杂一点的东西,那么可以通过render来写
                    <span>
                        <a href="# ">补兵</a>
                        <a href="# "}>抢人头</a>
                    </span>
                ),
            }]
        }
        render(
            <div className="tabledemo">
                  <Table rowSelection={rowSelection} columns={this.columns} dataSource={data} />      //这里columns={this.columns},要用this.
            </div>
        );
    }
    

    state的true与false应用

    export default class Demo extends React.Component {
                state={
                    visible:false
                }
                boxshow=()=>{
                    this.setState({visible:true})
                }
                boxhide(){
                    this.setState({visible:false})
                }
              render(){
                return (
                    <div>
                            <button onClick={this.boxshow}>点我显示</button>
                            <button onClick={()=>{this.boxhide()}}>点我隐藏</button>
                            { this.state.visible ? [<div className="box">我是Box</div> ] : [ null ] }
                            { this.state.visible ? <div className="box">我是Box</div> :  null }   //加不加 [] 视情况而定
                           
                    </div>
                   
                );
        }
    }
    
    

    正则表达式使用

    以邮箱正则验证为例
    export default class Demo extends React.Component {
            
            handleEmail(e){
            let value= e.target.value;
            if( ! ( /^[A-Za-zd]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,4}$/.test(value) ) ){
                    console.log("请输入正确的邮箱");
               }
            }
    
            render(){
                return(
                    <div>
                        <Input placeholder="请输入邮箱" type="text" onChange={this.handleEmail.bind(this)} />
                    </div>
                );
            }
    }
    

    antd,modal属性

    antd modal.success小提示框添加api
    
    function success(){
        Modal.success({
            title:"系统提示",
            content:"短链接复制成功",
            centered:true,            //属性这样写
            mask:true,
            maskClosable:true,
            okText:"确定",
        })  
    }
    
    
    antd标准模态框里将"确定"按钮去除,只保留一个"取消"按钮
    <Modal
         title="关键字"
         visible={this.state.visible}
         onOk={this.handleOk}
         onCancel={this.handleCancel}
         width={1000}
         centered={true}
         footer={(                                 //这一段代码设置了footer里的按钮属性
            <div style={{textAlign:"center"}}>
                <Button key="back" onClick={this.handleCancel} style={{padding:"0 35px"}}>取消</Button>   
             </div>
          )}  >
    
          <div>
                content
          </div>
    </Modal>
    
    

    react里写js

        `${js代码}`
    

    react插入图片

    单张引入

    两种办法可以解决图片不多,在前端直接加载图片路径的问题

    第一种:import方法
    import logos from '../../assets/images/logos.png';//src/assets
    render() {
    		return (
    			<img src={logos} alt="logo" />
    		);
    	}
    
    
    第二种:require方法
    <img alt="logo" src={require('../../assets/images/logos.png')}  />
    使用这种方法切记  require里只能写字符串,不能写变量
    
    多张引入(适用于数据库读取)

    假设需要从数据库中读取图片的路径,require不能写变量,import from后面也不能写变量,该怎么办,如下

    json:
    
    [
      {
        "name":'img1'
        "img":"img1",
        "url":""
      },
      {
        "name":"img2",
        "img":"img2",
        "url":""
      },
      {
        "name":"img3",
        "img":"img3",
        "url":""
      }
    ]
    
    
    
    react:
    
    import img1 from'./../images/img1.png';
    import img2 from'./../images/img2.png';
    import img3 from'./../images/img3.png';
     
    const imgsArr = [img1,img2,img3];
     
    render(){
        return(
            <div>
                {
                    imgsArr.map(function(name){
                        return(
                            <img src={name} />
                        )
                    }) 
                }
            </div>
        )
    }
    
    
    

    返回上一页

    this.props.history.goBack()
    
    this.props.history.go(-1)       this.props.history.go(0) 当前页
    
    this.props.history.push("/demo/index/setting/settingindex")
    
    

    map用法

    this.state.keywords.map((item,index) => {
                                                  return <Col span={4} className="code-keyword" key={index} onClick={() => {this.keywordsClick(item)}}><span>{item.content}</span></Col>;
                                                })
    
    

    const的位置

        //可以在这里const
    export default class Demo extends React.Component{
        state={}
        render(){
            
            //也可以在这里const
            return();
        }
    }
    

    写样式

    1、loading.style.display="block"
    
    2、<div style={{display:"block",}}></div>
    
    3、在less页面中写,在当前页面引入·
    

    删除,弹出模态框询问,回调函数写在一个函数里

    productDelete=(productInfo)=>{
            Modal.confirm({
                title:"删除产品",
                content:`您确认要删除产品 "${productInfo.name}" 吗?`,
                centered:true,
                okText:"确定",
                cancelText:"取消",
                onOk:async()=>{
                    let data=await api.productDeleteApi({
                        id:productInfo.id,
                    })
                    if(data.code===0){
                        this.onChangePage();
                        message.success(`产品 "${:productInfo.name}" 删除成功!`)
                    }else{
                        message.error(api.stateCode[data.code])
                    }
                }
            })
        }
    

    antd的table组件里给数值编译

    this.columns=[
        {
            title:"姓名",
            dataIndex:"name",
        }
        {
            title:"状态",
            dataIndex:"state",
            render(a){
                let config={
                    "1":<Badge status="success" text="成功" />,
                    "2":<Badge status="error" text="报错" />,
                    "3":<Badge status="default" text="正常" />,
                    "4":<Badge status="processing" text="进行中" />,
                    "5":<Badge status="warning" text="警告" />,
                }
                    return config[a];
            }
        }
    ]
    

    antd的Modal调用后,页面样式产生变动

    antd 的Modal在调用后,会在body里加上style={{paading-right:"17px",overflow:"hidden"}}样式
    这个样式的本意是如果模态框内容过多导致模态框超出页面高度,那么右侧会有滚动条出现,模态框便可以滚动并且此滚动条会覆盖之前的滚动条。
    但是今天遇到一个因为这个引发的问题:就是如果当前页面内容已经超出页面高度时,右侧本来就是会有滚动条的。
    如图
    
    
    而此时如果再调用模态框,那么滚动条之间就会产生冲突,从而引发页面样式的小变动。
    解决方法:给当前页面的body设置样式   
            body{
               padding:0!important;
               margin:0!important;
               overflow:visible!important;
          }
    注:此方法当前页面全局使用可能会带来其他问题,请谨慎使用。
    
    

  • 相关阅读:
    excel复杂表头导出
    搜索联想词(提示词)实现
    做题常用容器及方法
    课外加餐:1 | 浏览上下文组:如何计算 Chrome 中渲染进程的个数?
    浏览器安全:36 | HTTPS:让数据传输更安全
    课外加餐 2 | 任务调度:有了 setTimeOut,为什么还要使用 rAF?
    springBoot 配置SwaggerUi接口测试
    jmeter报错javax.script.ScriptException: UnicodeEncodeError: 'ascii' codec can't encode characters in position 109111: ordinal not in range(128) in <script> at line number 3
    websocketpython
    测试
  • 原文地址:https://www.cnblogs.com/huihuihero/p/10834600.html
Copyright © 2020-2023  润新知