Size: a a a

React — русскоговорящее сообщество

2021 January 24

YS

Yevhen Soldatov in React — русскоговорящее сообщество
import React, { createContext, useState } from 'react'
import { validations } from 'utils/validations'

export const FormCtx = createContext({
fields: {},
errors: {},
editFields: () => {
},
})
const Form = ({ children, ...props }) => {
const [fields, setFields] = useState({})
const [errors, setErrors] = useState({
 ...props.customError,
})
const [isSubmit, setSubmit] = useState(false)
const removeField = (id) => {
 delete fields[id]
 delete errors[id]
}
const addField = ({ field, value }) => {
 if (field && field.id) {
  setFields(prevState => ({
   ...prevState,
   [field.id]: { value, ...field },
  }))
  return
 }
 throw new Error(`please add field "id" for ${field}`)
}
const editFields = (event, { id, value }) => {
 if (event) {
  event.persist()
 }
 const field = fields[id]
 let val = event ? event.currentTarget.value : value
 setFields((prevState) => {
  return {
   ...prevState,
   [field.id]: {
    ...field,
    value: val,
   },
  }
 })
 return val
}
const validateField = (id, additionValidation) => {
 let error = ''
 let { value: fieldValue, validate, displayName, customrules = {} } = fields[id]
 if (additionValidation) {
  validate += '|' + additionValidation
 }
 const rules = validate ? validate.split('|') : ''
 if (rules.length) {
  for (const rule in rules) {
   if (rules.hasOwnProperty(rule)) {
    let ruleName = rules[rule]
    let length = ''
    if (rules[rule].includes('minLength') || rules[rule].includes('maxLength')) {
     length = ruleName.substr(9)
     ruleName = ruleName.substr(0, 9)
    }
    const validation = validations[ruleName] || {
     rule: customrules[ruleName].rule,
     formatted: customrules.formatted,
    }
    const isRuleSatisfied = ruleName !== 'required' && !fieldValue
     ? true
     : validation.rule(length).test(fieldValue.toString())
    if (!isRuleSatisfied) {
     error = validation.formatted.apply(null, [displayName || id, length])
    }
    if (error !== '') {
     break
    }
   }
  }
  setErrors(prevState => ({
   ...prevState,
   [id]: error,
  }))
 }
}
console.log(fields)
return <form action='' className={props.classNames}>
 <FormCtx.Provider value={{
  fields, errors, setErrors, addField,
  editFields, validateField, isSubmit, setSubmit, removeField
 }}>
  {children}
 </FormCtx.Provider>
</form>
}
export default Form
источник

YS

Yevhen Soldatov in React — русскоговорящее сообщество
Код контекста
источник

IA

I-Am Alone in React — русскоговорящее сообщество
Тебя щас осудят(за код в чате)
источник

АБ

Александр Бакиматов... in React — русскоговорящее сообщество
Yevhen Soldatov
import React, { createContext, useState } from 'react'
import { validations } from 'utils/validations'

export const FormCtx = createContext({
fields: {},
errors: {},
editFields: () => {
},
})
const Form = ({ children, ...props }) => {
const [fields, setFields] = useState({})
const [errors, setErrors] = useState({
 ...props.customError,
})
const [isSubmit, setSubmit] = useState(false)
const removeField = (id) => {
 delete fields[id]
 delete errors[id]
}
const addField = ({ field, value }) => {
 if (field && field.id) {
  setFields(prevState => ({
   ...prevState,
   [field.id]: { value, ...field },
  }))
  return
 }
 throw new Error(`please add field "id" for ${field}`)
}
const editFields = (event, { id, value }) => {
 if (event) {
  event.persist()
 }
 const field = fields[id]
 let val = event ? event.currentTarget.value : value
 setFields((prevState) => {
  return {
   ...prevState,
   [field.id]: {
    ...field,
    value: val,
   },
  }
 })
 return val
}
const validateField = (id, additionValidation) => {
 let error = ''
 let { value: fieldValue, validate, displayName, customrules = {} } = fields[id]
 if (additionValidation) {
  validate += '|' + additionValidation
 }
 const rules = validate ? validate.split('|') : ''
 if (rules.length) {
  for (const rule in rules) {
   if (rules.hasOwnProperty(rule)) {
    let ruleName = rules[rule]
    let length = ''
    if (rules[rule].includes('minLength') || rules[rule].includes('maxLength')) {
     length = ruleName.substr(9)
     ruleName = ruleName.substr(0, 9)
    }
    const validation = validations[ruleName] || {
     rule: customrules[ruleName].rule,
     formatted: customrules.formatted,
    }
    const isRuleSatisfied = ruleName !== 'required' && !fieldValue
     ? true
     : validation.rule(length).test(fieldValue.toString())
    if (!isRuleSatisfied) {
     error = validation.formatted.apply(null, [displayName || id, length])
    }
    if (error !== '') {
     break
    }
   }
  }
  setErrors(prevState => ({
   ...prevState,
   [id]: error,
  }))
 }
}
console.log(fields)
return <form action='' className={props.classNames}>
 <FormCtx.Provider value={{
  fields, errors, setErrors, addField,
  editFields, validateField, isSubmit, setSubmit, removeField
 }}>
  {children}
 </FormCtx.Provider>
</form>
}
export default Form
выложи эту простыню в песочницу, в телеге такое читать невозможно
источник

NF

Nikita Fidyk in React — русскоговорящее сообщество
Всем привет. Простой вопрос: принцип "презентационных" и "контейнерных" компонентов имеет место быть или он устарел?
источник

АБ

Александр Бакиматов... in React — русскоговорящее сообщество
Nikita Fidyk
Всем привет. Простой вопрос: принцип "презентационных" и "контейнерных" компонентов имеет место быть или он устарел?
устарел
источник

VB

Volodymyr Borysov in React — русскоговорящее сообщество
Nikita Fidyk
Всем привет. Простой вопрос: принцип "презентационных" и "контейнерных" компонентов имеет место быть или он устарел?
Устарел. Давно не видел в использовании их
источник

СМ

Стас М in React — русскоговорящее сообщество
Приветствую.

Подскажите пжл, как redux-thunk использовать с хуками react-redux?
Так же в dispatch отправляется функция, в которой делается асинхронный запрос (например, с пом. fetch или axios), а после этого диспатчится экшн с полученными данными? Я правильно понимаю?
источник

VR

Victor Rusakovich in React — русскоговорящее сообщество
Nikita Fidyk
Всем привет. Простой вопрос: принцип "презентационных" и "контейнерных" компонентов имеет место быть или он устарел?
С приходом хуков - больше не нужен, теперь легко получить доступ к корневому стейту/контексту без оборачивания потребителя в доп теги
источник

NF

Nikita Fidyk in React — русскоговорящее сообщество
Вместе с Реакт + Редакс используют localstate в связке с Хуками?
источник

АБ

Александр Бакиматов... in React — русскоговорящее сообщество
Стас М
Приветствую.

Подскажите пжл, как redux-thunk использовать с хуками react-redux?
Так же в dispatch отправляется функция, в которой делается асинхронный запрос (например, с пом. fetch или axios), а после этого диспатчится экшн с полученными данными? Я правильно понимаю?
const dispatch = useDispatch()
    dispatch(yourActionCreator())
источник

NF

Nikita Fidyk in React — русскоговорящее сообщество
Всё понял, спасибо)
источник

VR

Victor Rusakovich in React — русскоговорящее сообщество
Nikita Fidyk
Вместе с Реакт + Редакс используют localstate в связке с Хуками?
Так Стейт компонентов никуда не делся, просто хуками он локаничнее, чем в компонентах.
источник

СМ

Стас М in React — русскоговорящее сообщество
Александр Бакиматов
const dispatch = useDispatch()
    dispatch(yourActionCreator())
благодарю.
источник

АБ

Александр Бакиматов... in React — русскоговорящее сообщество
Victor Rusakovich
Так Стейт компонентов никуда не делся, просто хуками он локаничнее, чем в компонентах.
чо?
источник

YS

Yevhen Soldatov in React — русскоговорящее сообщество
Yevhen Soldatov
Привет всем, у меня такая проблема:
Решил юзать реакт без редакса и обрабатываю формы с помощью контекста… то есть добавляю по id field и данные его ..
Все было ок пока не столкнулся с такой проблемой что когда я отрисовываю список с помощью map мне нужно указывать уникальны id и я его добавляю с помощью name_field + index  и понятное дело я не думал о том  что мне нужно как-то удалять данные из списка при этом что бы id соответс полю!
Есть такая штука как react-uuid для генерации идентификаторов, но тут проблема в том что мне нужно знать как называется поле, что бы при сборке (сабмита) отдать правильные данные
источник

NF

Nikita Fidyk in React — русскоговорящее сообщество
Victor Rusakovich
Так Стейт компонентов никуда не делся, просто хуками он локаничнее, чем в компонентах.
Меня просто интересовал вопрос с этими двумя типами компонентов, геморно писать в двух разных компонентах, а потом их соединять конектом, хотя во всех источниках уже в один компонент складывают и локальный стейт и сам jsx
источник

VR

Victor Rusakovich in React — русскоговорящее сообщество
Nikita Fidyk
Меня просто интересовал вопрос с этими двумя типами компонентов, геморно писать в двух разных компонентах, а потом их соединять конектом, хотя во всех источниках уже в один компонент складывают и локальный стейт и сам jsx
Немного потерял мысль, если честно.
источник

NF

Nikita Fidyk in React — русскоговорящее сообщество
Я может не совсем правильно написал, вообще-м я ответ нужный получил, спасибо)
источник

ВБ

Вова Белый in React — русскоговорящее сообщество
Короче извините за мат но я сгорел с видосов React путь самурая когда чел 20 минут объясняет что пропс это входящий параметр не объясняя ничего помимо этого и хочу перейти к документации, есть ли олды которые подскажут, если я пройду все темы сверху вниз мне объясняет все актуальные концепты и подходы? Или документация не часто обновляется
источник