Disclaimer: Безусловно, эта статья для начинающих кодеров на React. Опытный и не очень react-разработчик не найдет тут ничего полезного. Разве что может указать на ошибки(буду благодарен).
Построение и декомпозиция проекта.
Никакой сложной архитектуры и декомпозиции не будет. Цель проекта - показать часто встречаемое применение хука useState и связка javascript кода с html элементами в одном компоненте. Всего будем использовать только три файла: App.js, App.css и Gradient.js.
Инициализация и структурирование проекта
Создаем react проект при помощи команды в терминале npx create-react-app myApp
Ждем инициализацию проекта. После чего, в нашей папке проекта сформировалась дефолтная структура react-проекта. Конечно мы можем создать наш gradient background creator прямо в App.js, но так никто не делает и это не разумно, потому что главной особенностью реакта является разбивка элементов сайта на компоненты и вставка их в родительские(или в соседние) компоненты.
Переходим к созданию нашего компонента Gradient. В директории src создаем папку components, а папке components создаем файл с типом .js Gradient.js. Правильней было бы сделать для каждого компонента свою папку, где будет сам компонент и его стиль, но, поскольку у нас будет только один компонент сделаем так. Прежде чем начать работу с градиентом, вставим его в основной компонент App.js:
import React from "react";
import './App.css';
import Gradient from "./components/Gradient";
function App() {
  return (
    <div className="App">
      <Gradient />
    </div>
  );
}
export default App;Теперь переходим в Gradient.js и создаем компонент. Сразу же проинициализируем три useState. Один будет отвечать за настройку первого цвета для нашего градиента, второй - для второго. Также добавим ещё один useState для градуса наклона градиента и константу cssOutput для отображения css кода для клиента:
const [color1, setColor1] = useState('#5938ff'); //вносим дефолтный цвет для первого
const [color2, setColor2] = useState('#ffe224'); //вносим дефолтный цвет для второго
const [deg, setDeg] = useState(180); //градус по умолчанию будет 180
//вносим переменные, которые мы зададим
const cssOutput = `linear-gradient(${deg}deg, ${color1}, ${color2})`;Не забываем про импорты:
import React, { useState } from "react";
import "../App.css";Теперь переходим к html разметке. Создает главный div с классом main(его стиль будет ниже). В главном дивe будет два чайлда: первые это блок у которого мы будем менять цвет бэкграунда, а второй это блок с инструментами, с которыми мы будем взаимодействовать. К диву с классом градиент добавляем style с нашей переменой cssOutput(в которую и будут вноситься выбранные нами параметры.
    return(           
        <div className="main">
          <div className="gradient" style={{ background: cssOutput }}></div>
          <div className="content">
        </div>
        </div>
    )Открываем App.css и пишем стили для блоков. Для background-image в body я взял рандомный mesh gradient с интернета. Класс .content я решил выполнить в полупрозрачном стиле и с размытием заднего фона(backdrop-filter: blur(5px);)
body {
  margin: 0px;
  padding: 0px;
  font-family: Verdana, Geneva, Tahoma, sans-serif;
  color: rgba(0, 0, 0, 0.5);
  background-image: url("./bg-mesh.png");
}
.main {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
.gradient{
  width: 70vw;
  height: 44vh;
  border-radius: .4rem;
  margin: 20px;
}
.content{
  display:flex;
  flex-direction: column;
  align-items: center;
  background: rgba(233, 233, 233, 0.6);
  backdrop-filter: blur(5px);
  border-radius: .4rem;
  padding-left: 200px;
  padding-right: 200px;
}Переходим у главному - создание инпутов и их связка со стэйтами, которые мы определили в начале. Все инпуты находятся в блоке content, и их всего три: первый цвет, второй и градус наклона цветов. Input с типом color - это простая браузерная палитра цветов. Мы выбираем понравившийся нам цвет, onChange это видит и вызванная функция setColor вносит название цвета в переменную color, которая и является value инпута. Тоже самое с инпутом для градуса наклона. При помощи типа инпута range, мы выбираем градус наклона от 0 до 360 и передаем в переменную deg. И в самом конце выводим переменную cssOutput, которая отображает css код текущего градиента.
          <div className="content">
          <h2>CSS Gradient Background Creator</h2>
          <div className="pickers">
          <h3>Color 1:</h3>
          <input
            type="color"
            name="color1"
            value={color1}
            onChange={event=> setColor1(event.target.value)}
            />
          <h3>Color 2:</h3>
          <input type="color"
           name="color1"
           value={color2}
           onChange={event=> setColor2(event.target.value)}
    /></div>
    <h2>Choose a deg:</h2>
          <input type="range" className="range" min="0" max="360" step="1"
           value={deg} onChange={event=> setDeg(event.target.value)} /> 
          <h3>{cssOutput}</h3>
        </div>Остальные стили:
.pickers{
  display: flex;
  align-items: center;
}
.pickers h3{
  margin: 10px;
}
.range{
  width: 60%
}Вот и всё. Мы создали полностью работающий css gradient background creator меньше чем за 8 минут с возможностью менять цвета и наклон градиента в реальном времени наблюдая за блоком с классом gradient. Полный код компонента:
import React, { useState } from "react";
import "../App.css";
const Gradient = ()=>{
const [color1, setColor1] = useState('#5938ff');
const [color2, setColor2] = useState('#ffe224');
const [deg, setDeg] = useState(180);
const cssOutput = `linear-gradient(${deg}deg, ${color1}, ${color2})`;
    return(           
        <div className="main">
          <div className="gradient" style={{ background: cssOutput }}></div>
          <div className="content">
          <h2>CSS Gradient Background Creator</h2>
          <div className="pickers">
          <h3>Color 1:</h3>
          <input
            type="color"
            name="color1"
            value={color1}
            onChange={event=> setColor1(event.target.value)}
            />
          <h3>Color 2:</h3>
          <input type="color"
           name="color1"
           value={color2}
           onChange={event=> setColor2(event.target.value)}
    /></div>
    <h2>Choose a deg:</h2>
          <input type="range" className="range" min="0" max="360" step="1"
           value={deg} onChange={event=> setDeg(event.target.value)} /> 
          <h3>{cssOutput}</h3>
        </div>
        </div>
    )
}
export default Gradient;Что ещё можно добавить?
Много чего. Например: возможность скачивать градиент как картинку, добавлять 3 и больше цветов, создавать не только линейный градиент, а и радиальный... В общем много чего. Надеюсь, начинающие react разработчики нашли хоть что-то полезное для себя.
 
           
 
pythonist1234
cssOutput же не будет меняться.delaklo Автор
Будет. Меняется deg и коды цветов. Вот Ссылка на гитхаб pages
pythonist1234
Затупил немного, извините(