React this.setState 详解

15 篇文章 0 订阅
10 篇文章 0 订阅
setState(arg1,arg2) 括号内的arg1可传入两种参数,一种是对象,一种是函数. arg2为更改state之后的回调方法,arg2可为空.

对象式的setState用法

例如:

//第一种
this.setState({ isAuthenticated: true});
this.setState({ isAuthenticated: true},()=>{});

this.setState(
			 {isAuthenticated: true},
			 () => console.log(this.state.isAuthenticated + '.'));

函数式的setState用法

这个函数会接收到两个参数,第一个是当前的state值,第二个是当前的props,这个函数应该返回一个对象,这个对象代表想要对this.state的更改,换句话说,之前你想给this.setState传递什么对象参数,在这种函数里就返回什么对象,不过,计算这个对象的方法有些改变,不再依赖于this.state,而是依赖于输入参数state。
这个函数格式是固定的,必须第一个参数是state的前一个状态,第二个参数是属性对象props,这两个对象setState会自动传递到函数中去

有两种写法:

//第二种 , 有两种写法 区别在于括号
this.setState((preState, props) => {
                    return {isAuthenticated: props.isAuthen}
                });
                
this.setState((preState, props) => ({
                    isAuthenticated: !preState.isAuthenticated
                }));

仔细看可以发现,前者是return了一个对象,后者直接写了一个对象,但是后者的对象外层比前者的写法多了个括号,使用时需要注意。
如果你希望在setState之前做些什么 可以使用前者的写法:

 this.setState((preState, props) => {
                    console.log(preState)
                    return {isAuthenticated: true}
                }, () => console.log(this.state.isAuthenticated));
//这个写法意思就是,在改变state中的数据之前,打印出当前的state,然后在更新state之后,
//利用回调打印出this.state.isAuthenticated
使用场景:

调用setState,组件的state并不会立即改变,setState只是把要修改的状态放入一个队列中,React会优化真正的执行时机,并且React会出于性能原因,可能会将多次setState的状态修改合并成一次状态修改。所以不要依赖当前的State,计算下个State。
例如:

function incrementMultiple() {
  this.setState({count: this.state.count + 1});
  this.setState({count: this.state.count + 1});
  this.setState({count: this.state.count + 1});
}

直观上来看,当上面的incrementMultiple函数被调用时,组件状态的count值被增加了3次,每次增加1,那最后count被增加了3,但是,实际上的结果只给state增加了1。

原因并不复杂,就是因为调用this.setState时,并没有立即更改this.state,所以this.setState只是在反复设置同一个值而已,上面的code等同下面这样。

function incrementMultiple() {
  const currentCount = this.state.count;
  this.setState({count: currentCount + 1});
  this.setState({count: currentCount + 1});
  this.setState({count: currentCount + 1});
}

currentCount就是一个快照结果,重复地给count设置同一个值,不要说重复3次,哪怕重复一万次,得到的结果也只是增加1而已。

那么如果想要结果是3怎么做呢?这时就需要第二种写法:

 _bsetIncrementMultiple = () => {
        this.setState(prevState => ({
            count: prevState.count + 1
        }));
        this.setState(prevState => ({
            count: prevState.count + 1
        }));
        this.setState(prevState => ({
            count: prevState.count + 1
        }));
    }

这样,每一次改变count的时候,都是prevState.count + 1,pervState是前一个状态,每次setState之后,前一个状态都会改变,那么这时候,结果就是想要的3了。如果需要立即setState 那么传入一个函数来执行setState是最好的选择

更详细内容可参考:setState:这个API设计到底怎么样

Tesseract.js是一个基于Google开发的OCR引擎Tesseract的JavaScript库,可以在浏览器和Node.js环境中使用。React是一个由Facebook开发的用于构建用户界面的JavaScript库。在React应用程序中使用Tesseract.js可以使您的应用程序具有识别图像文本的能力。 以下是使用Tesseract.js在React应用程序中识别图像文本的详细步骤: 1. 首先,您需要安装Tesseract.js库。在您的React应用程序中,可以使用npm或yarn进行安装。使用以下命令进行安装: ``` npm install tesseract.js ``` 2. 接下来,您需要导入Tesseract.js库。您可以使用以下代码将其导入到React组件中: ```javascript import Tesseract from 'tesseract.js'; ``` 3. 然后,您需要创建一个函数,该函数将处理图像并将其传递给Tesseract.js以进行文本识别。您可以使用以下代码创建一个名为recognizeText的函数: ```javascript const recognizeText = async (image) => { const result = await Tesseract.recognize(image, 'eng'); return result.data.text; }; ``` 在上面的代码中,我们将image和'eng'作为参数传递给Tesseract.recognize()方法。image参数是要识别的图像,'eng'参数是要使用的语言。您可以根据需要更改这些参数。 4. 接下来,您需要在React组件中使用recognizeText函数。您可以在React组件的事件处理程序中使用它。例如,以下是一个名为handleImageUpload的事件处理程序,该处理程序将在选择图像时调用recognizeText函数并将结果存储在React状态中: ```javascript handleImageUpload = async (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onloadend = async () => { const image = new Image(); image.src = reader.result; image.onload = async () => { const result = await recognizeText(image); this.setState({ text: result }); }; }; reader.readAsDataURL(file); }; ``` 在上面的代码中,我们使用FileReader读取选定的图像文件。然后,我们创建一个新的Image对象,并将其设置为从文件读取的结果。最后,我们在图像加载完成后调用recognizeText函数,并将结果存储在React状态中。 5. 最后,您可以在React组件的render方法中使用识别的文本。例如,以下是一个简单的render方法,该方法将识别的文本显示在屏幕上: ```javascript render() { return ( <div> <input type="file" onChange={this.handleImageUpload} /> <p>{this.state.text}</p> </div> ); } ``` 在上面的代码中,我们将handleImageUpload事件处理程序分配给文件上传输入。然后,我们使用this.state.text显示识别的文本。 这就是在React应用程序中使用Tesseract.js识别图像文本的基本步骤。您可以根据需要自定义这些代码以满足您的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值