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;
      }
注:此方法当前页面全局使用可能会带来其他问题,请谨慎使用。

原文地址:https://www.cnblogs.com/huihuihero/p/10834600.html