[React] Update Component State in React With Ramda Lenses

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[React] Update Component State in React With Ramda Lenses相关的知识,希望对你有一定的参考价值。

In this lesson, we‘ll refactor a React component to use Ramda lenses to update our component state. We‘ll create a lens to focus on the property we want to target and use over to apply the existing state value to a utility function and we‘ll get back a new state that will be reflected in our rendered UI.

 

We have code here, and we are going to improve the code:

//@flow

import React from ‘react‘;
import {inc, dec} from ‘ramda‘;


export default class Counter extends React.Component {

    state = {
        count: 0
    };

    increase = () => {
        this.setState((prevState) => {
            return {
                count: inc(prevState.count)
            };
        })
    };

    decrease = () => {
        this.setState((prevState) => {
            return {
                count: dec(prevState.count)
            }
        })
    };

    render() {
        return (
            <div>
                <button onClick={this.increase}>+</button>
                {this.state.count}
                <button onClick={this.decrease}>-</button>
            </div>
        );
    }

}

 

First, we can use Ramda lense to update code, if the component‘s state contains only one prop, it is ideal to use lense to create reusable method:

import {inc, dec, lensProp, over} from ‘ramda‘;

// Using Lense
const countLens = lensProp(‘count‘);

export default class Counter extends React.Component {

    state = {
        count: 0
    };

    increase = () => this.setState(
        (prevState) => over(countLens, inc, prevState)
    );

    decrease = () => this.setState(
        (prevState) => over(countLens, dec, prevState)
    );

 

Because Ramda‘s method are auto currying, so we can write like:

    increase = () => this.setState(over(countLens, inc));

    decrease = () => this.setState(over(countLens, dec));

 

Second, it is recommended to pull out busniess logic out of component, so we can do:

//@flow

import React from ‘react‘;
import {inc, dec, lensProp, over} from ‘ramda‘;

// Using Lense
const countLens = lensProp(‘count‘);
const increase = over(countLens, inc);
const decrease = over(countLens, dec);

export default class Counter extends React.Component {

    state = {
        count: 0
    };

    increase = () => this.setState(increase);

    decrease = () => this.setState(decrease);

    render() {
        return (
            <div>
                <button onClick={this.increase}>+</button>
                {this.state.count}
                <button onClick={this.decrease}>-</button>
            </div>
        );
    }

}

 

以上是关于[React] Update Component State in React With Ramda Lenses的主要内容,如果未能解决你的问题,请参考以下文章

react常见组件问题Can't perform a React state update on an unmounted component

react项目Bug:组件销毁清除监听(Can't perform a React state update on an unmounted component.)

useFetch Can't perform a React state update on an unmounted component 警告

React + antd 组件离开页面以后出现Can only update a mounted or mounting component 的解决办法

React子组件

react 子组件访问父组件的方法