zoukankan      html  css  js  c++  java
  • [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>
            );
        }
    
    }
  • 相关阅读:
    Eclipse安装TestNG插件
    总结Selenium WebDriver中一些鼠标和键盘事件的使用
    【资料收集】AutomationGuru
    centos7.4 yum安装包出现网络不可达跟Recv failure: Connection reset by peer" 这个问题
    ubuntu配置ntp
    OpenStack-ansible ubuntu16.04安装&& centos7 安装 && openSUSE 安装OpenStack-ansible
    HSRP&&STP&&ACL
    vlan通讯&&动态路由
    cisco交换机基本配置
    cisco教程 怎么改console密码 主机名 各种模式的切换等
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6741675.html
Copyright © 2011-2022 走看看