Сохранение регулярных выражений в магазине Redux? - PullRequest
2 голосов
/ 25 сентября 2019

Как сохранить регулярное выражение в Redux хранилище?

Пример:

У меня есть сохраненное регулярное выражение в объекте:

const regexes = {
   name: /^[a-zA-Z0-9_]*$/
}

ПослеПри сохранении этого объекта в хранилище редуксов регулярное выражение потеряно (проанализировано для пустого объекта):

// Dispatch
dispatch(setRegexes(regexes))
// Redux Dev Tools:
{
   name: {}
}

Регулярное выражение нормально, даже если оно получено в качестве полезной нагрузки в редуктор:

// Reducer
case 'SET_REGEXES':
   console.log(payload.regexes) // {name: /^[a-zA-Z0-9_]*$/}
   return {...store, regexes: payload.regexes}
break;

Это означает, что полезная нагрузкавероятно stringified для JSON и регулярное выражение потеряно .

есть ли какое-то решение?Или я не должен сохранять регулярные выражения в редуксе, даже если технически сохранение регулярных выражений в объект JavaScript допустимо.

РЕДАКТИРОВАТЬ: я пытаюсь достичь ситуации, когда мне не нужно использовать new RegExp(store.regexes.name)Я хочу сохранить фактическое регулярное выражение в хранилище, потому что хранилище - это объект JavaScript.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2019

Просто преобразовать регулярное выражение в строку

// Reducer
case 'SET_REGEXES':
   console.log(payload.regexes) // {name: /^[a-zA-Z0-9_]*$/}
   return {...store, regexes: payload.regexes.name.toString()} // Convert to string
break;

const regexp1 = /^[a-zA-Z0-9_]*$/
console.log(regexp1.toString())
0 голосов
/ 26 сентября 2019

Согласно моему комментарию, это звучит как проблема Redux Dev Tools, а не проблема Redux.

Вероятно, инструменты Dev сериализуют данные перед входом в консоль, но сам объект RegExp должен быть правильно сохранен.в вашем штате.

Если вы хотите хранить несериализуемые данные в вашем штате, будет зависеть от вашего собственного контекста и требований.

Согласно документации Redux:

Настоятельно рекомендуется размещать в магазине только простые сериализуемые объекты, массивы и примитивы.Технически возможно вставлять несериализуемые элементы в хранилище, но это может нарушить возможность сохранения и повторного увлажнения содержимого хранилища, а также помешать отладке во время путешествия.

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

Источник: https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state

0 голосов
/ 25 сентября 2019

Вы можете сначала преобразовать RegExp в строку через его source свойство

case 'SET_REGEXES':
   const regexsrc = regexes.name.source;
   return {...store, regexes: {name: regexsrc}}
break;

или запустить цикл преобразования каждого свойства, если regexes на самом деле является массивом.

Затем простосделать new RegExp(str) для поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...