React各种注意事项,踩过的坑.

注意事项

用create-react-app创建项目,因要配置各种组件,比如babel,antd等,

需要运行 npm run eject 命令把项目的配置文件暴露出来, 运行完多出一个config目录 =>其中就是和vue-cli相似的各种配置 ->并且不可逆

运行完create-react-app 要添加css-loader配置,

 

1.创建React组件的时候,首字母必须要大写,否则会出错

 

2.展开运算符 (...) 运用好时,可以节省很大的代码开销

 

3.新建的React组件,必须先引入react包,否则会报错

 

4.可通过配置webpack来使我们引入的组件自动追踪组件后缀名,具体查看React学习文档 ->webpack配置完要重启,

 

5.@符号在vue-cli包里面是自动配置好的,但是在React脚手架里面需要自己配置 ->配置完webpack记得重启

首先需要运行 npm run eject 暴露配置选项

 

然后找到对应的配置选项 alias: 将 '@': paths.appSrc 填入其中,重启webpack服务就可以在引入(import)文件的时候使用 @了

 

6.使用构造函数创建的React组件和使用class关键字创建的React组件存在一定的异同点:

6.1 构造函数创建的组件必须首先引入 React包 而使用class关键字创建的React组件不用(继承的除外)

 

6.2构造函数的实例方法一般挂在到构造函数的原型对象上,这样就不用在实例化(new)构造函数的时候过多占用内存了(每个实例对象都有改实例方法)

function

 

7.使用class关键字创建组件的注意事项:

①class类必须继承自React.Component类,

②在组件内部必须有一个render函数 返回值为jsx的虚拟dom结构

③必须使用export default暴露一下此先声明的类

④在class组件中如果要使用外接传递过来的参数,不需要接收,直接可以使用 this.props来使用

 

8.如果要使用行内样式

import React from 'react';

class ChartDemo extends React.Component{
    constructor() {
        super();
        this.state = {

        }
    }
    render() {
        /*如果要使用行内样式 用例如下*/
        /*red不用引号报过 将会被当做变量解析 */
        return <div className="chart">
            <div style={{color:'red'}}>评论人: {this.props.name}</div>
            <div>评论内容: {this.props.chartContent}</div>
        </div>
    }
}

export default ChartDemo;

9.在使用外联css样式表的时候,一定要给 sass/css 添加module选项,这样可以防止样式的冲突, 在vue中避免样式冲突的方式是 <style scoped> </style>

 

具体操作为: 一 运行 npm run eject 暴露配置选项:

 

然后在此文件内修改 css/sass的module配置为true既可

 

此时

 

样式表的class被包装了 因此在使用的时候 必须使用

import css from '@/css/style.css'

然后使用css.class的方式将class添加到jsx的虚拟dom上

 

 

注意: 只开启modules的配置项 输出的class名是一堆混乱的字母 这样不好调试 可以在module下面添加一定的配置来让我们更好识别此编译的类名

localIdentName:'[path][name]__[local]__[hash:base64:5]'

 

 

注意可以使用gloabal将特定的类不被模块化(就是不被将style变成全局生效,经过了处理),没有此选项默认添加了 :local() => 此设置 在设置完module之后 默认的class会被编译

:global(.test){ //不会被编译 font-size: 19px; }

 

但是如果使用第三方的样式表的话,第三方的样式都是以 .css 结尾 要以上面的配置也会把第三方样式模块化,这样在使用第三方样式的话会很麻烦.因此,我们一般的做法为:

①:将我们自己写的css样式表文件后缀修改成 .scss 然后只对.scss的文件添加模块化

ps:使用react-create-app创建的项目 默认不添加sass loder 安装命令为:

npm install sass-loader node-sass --save-dev

 

②:将css文件的模块化去掉

 

8.在使用事件函数的时候,可以这样写

 

 

①在虚拟Dom上添加 (注意:在此用箭头函数的方式间接调用confirm可以改变this的指向,方便以后调用this.setState)

(在普通的函数当中,this指向调用它的元素,但是箭头函数中,this是指向上一级的元素比方说)

let root = document.getElementById('root');
// root.onclick = function () {
//     this.style.background = 'red';//此时this就是指向调用函数的root元素的
// }


root.onclick = () => {
    this.style.background = 'red';//但是此时的this指向的是window对象,
}

 

<button className="btn btn-success" onClick={()=>{this.confirm()}}>确定</button> 
//此时箭头函数里面只有一行函数,可以被优化成
<button className="btn btn-success" onClick={()=>this.confirm()}>确定</button> //将{}省掉

 

 

②用一个变量来接收一个箭头函数

confirm = () =>{
    console.log(this);
    this.setState({
        confirmContent: '确定更改了'
    })
}

 

这样两步做的目的就是减少出错,不会发生this指向问题.

 

如果要是这样使用需要在constructor里面绑定一下this的指向

<Button onClick={this.cancel}>取消</Button>

cancel() {
    this.setState({
        confirmContent: '取消了,更改回来'
    })
}

constructor() {
    super();
    this.state = {
        confirmContent: '这个是点击确认要更改的内容',
    }
    this.cancel = this.cancel.bind(this);
}

9.文本值双向绑定

即:react中不像vue中一样可以内部实现双向绑定,在react实现双向绑定的任务交给工程师.

在onchange中获取文本框的值的时候有两种方案

①.使用event.target.value

   注意使用箭头函数的时候,要将event传到箭头函数里面即 (event) => {this.func()},此时target中的value值打印出来是看不到的,直接使用就可以

②.使用类似vue中ref的方式来获取文本框中的值:

在React中使用this.refs.[name]来获取对应的value值.(vue中使用this.$refs[name]来获取)

例如 <input ref='inputEvent'/>

使用this.refs.inputEvent 来获取对应的数据

 changeHandel = (event) => {
        // console.log(event);
        let targetValue = event.target.value; //或者
        let tarValue = this.refs.inputVal.value;
        this.setState({ //此函数接收变化并更新虚拟dom
            inputVal: tarValue
        })
    }

    render() {
        return <div>
            <div>{this.state.inputVal}</div>
            <input type="text" className="form-control"
                   value={this.state.inputVal}
                   onChange={(event) => this.changeHandel(event)}
                   ref="inputVal"
            />
            {/*此时input必须绑定readOnly 或者onchange事件 要不然会报错*/}
            <Button className="btn-success" onClick={() => this.confirm('click')}>更改</Button>
            <Button className="btn  btn-danger" onClick={() => this.cancel()}>取消</Button>
        </div>
    }

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值