7 способов реализации нажатия кнопки в функциональных компонентах React JS

React JS — популярная библиотека JavaScript для создания пользовательских интерфейсов. Функциональные компоненты — ключевая особенность React, которая позволяет разработчикам создавать повторно используемые и модульные компоненты пользовательского интерфейса. Одним из распространенных шаблонов пользовательского интерфейса является функция переключения, при которой состояние компонента переключается между двумя разными значениями при нажатии кнопки. В этой статье мы рассмотрим несколько методов реализации переключения при нажатии кнопки в функциональных компонентах React JS, а также приведем примеры кода для каждого подхода.

Метод 1: useState Hook

import React, { useState } from 'react';
const ToggleButton = () => {
  const [isToggled, setToggled] = useState(false);
  const handleClick = () => {
    setToggled(!isToggled);
  };
  return (
    <div>
      <button onClick={handleClick}>
        {isToggled ? 'ON' : 'OFF'}
      </button>
    </div>
  );
};

Метод 2: Компонент класса с setState

import React, { Component } from 'react';
class ToggleButton extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isToggled: false,
    };
  }
  handleClick = () => {
    this.setState((prevState) => ({
      isToggled: !prevState.isToggled,
    }));
  };
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>
          {this.state.isToggled ? 'ON' : 'OFF'}
        </button>
      </div>
    );
  }
}

Метод 3: useReducer Hook

import React, { useReducer } from 'react';
const initialState = {
  isToggled: false,
};
const reducer = (state, action) => {
  switch (action.type) {
    case 'TOGGLE':
      return { ...state, isToggled: !state.isToggled };
    default:
      return state;
  }
};
const ToggleButton = () => {
  const [state, dispatch] = useReducer(reducer, initialState);
  const handleClick = () => {
    dispatch({ type: 'TOGGLE' });
  };
  return (
    <div>
      <button onClick={handleClick}>
        {state.isToggled ? 'ON' : 'OFF'}
      </button>
    </div>
  );
};

Метод 4: Компонент высшего порядка (HOC)

import React, { useState } from 'react';
const withToggle = (WrappedComponent) => {
  const ToggleWrapper = (props) => {
    const [isToggled, setToggled] = useState(false);
    const handleClick = () => {
      setToggled(!isToggled);
    };
    return (
      <div>
        <button onClick={handleClick}>
          {isToggled ? 'ON' : 'OFF'}
        </button>
        <WrappedComponent {...props} isToggled={isToggled} />
      </div>
    );
  };
  return ToggleWrapper;
};
const MyComponent = ({ isToggled }) => {
  return (
    <div>
      {isToggled ? <h1>Toggle is ON</h1> : <h1>Toggle is OFF</h1>}
    </div>
  );
};
const ToggleButton = withToggle(MyComponent);

Метод 5: Контекстный API

import React, { createContext, useContext, useState } from 'react';
const ToggleContext = createContext();
const ToggleProvider = ({ children }) => {
  const [isToggled, setToggled] = useState(false);
  const toggle = () => {
    setToggled(!isToggled);
  };
  return (
    <ToggleContext.Provider value={{ isToggled, toggle }}>
      {children}
    </ToggleContext.Provider>
  );
};
const ToggleButton = () => {
  const { isToggled, toggle } = useContext(ToggleContext);
  return (
    <div>
      <button onClick={toggle}>
        {isToggled ? 'ON' : 'OFF'}
      </button>
    </div>
  );
};
// Wrap your app with ToggleProvider

Метод 6: Redux

// Install and set up Redux in your project
// actions.js
export const toggle = () => ({
  type: 'TOGGLE',
});
// reducer.js
const initialState = {
  isToggled: false,
};
const toggleReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'TOGGLE':
      return { ...state, isToggled: !state.isToggled };
    default:
      return state;
  }
};
export default toggleReducer;
// ToggleButton.js
import React from 'react';
import {toggle } from './actions';
import { connect } from 'react-redux';
const ToggleButton = ({ isToggled, toggle }) => {
  return (
    <div>
      <button onClick={toggle}>
        {isToggled ? 'ON' : 'OFF'}
      </button>
    </div>
  );
};
const mapStateToProps = (state) => ({
  isToggled: state.isToggled,
});
const mapDispatchToProps = {
  toggle,
};
export default connect(mapStateToProps, mapDispatchToProps)(ToggleButton);

Метод 7: React Query

// Install and set up React Query in your project
import React, { useState } from 'react';
import { useMutation } from 'react-query';
const ToggleButton = () => {
  const [isToggled, setToggled] = useState(false);
  const toggleMutation = useMutation(() => {
    setToggled(!isToggled);
  });
  const handleClick = () => {
    toggleMutation.mutate();
  };
  return (
    <div>
      <button onClick={handleClick}>
        {isToggled ? 'ON' : 'OFF'}
      </button>
    </div>
  );
};

В этой статье мы рассмотрели семь различных методов реализации переключения при нажатии кнопки в функциональных компонентах React JS. Каждый метод имеет свои преимущества и может подходить для разных сценариев. Независимо от того, предпочитаете ли вы использовать перехватчики, компоненты классов, компоненты более высокого порядка или внешние библиотеки, такие как Redux и React Query, у вас есть несколько вариантов достижения желаемой функциональности переключения в ваших приложениях React. Выберите метод, который лучше всего соответствует требованиям вашего проекта и стилю кодирования.