Как получить предмет из магазина «Редукс» с помощью саги «Редукс»: решено - PullRequest
2 голосов
/ 02 декабря 2019

РЕДАКТИРОВАТЬ: решение в конце

Итак, я получил данные из API и сохранил их в моем хранилище Redux. Это массив объектов, содержащий 100 объектов. На внешнем интерфейсе я показываю 4 ключа от каждого объекта.

Сейчас я пытаюсь сделать это на внешнем интерфейсе, выполнить поиск по ключу (имя или год) и отобразить результаты. В идеале это было бы что-то вроде ILIKE в PSQL, но даже результат был бы только тогда, когда e.target.value === obj.super.nested.key || obj.super.nested.key_two был бы поразительным.

Я пытался использовать select () из redux-saga / Effects безрезультатно.

Первоначально я попытался использовать onChange поля ввода для отправки действия наблюдателю сe.target.value в качестве параметра, который будет вызывать функцию, использующую это значение в качестве параметра для select ().

Код с PSQL вместо Sagag-приставки будет:

    const [val, setVal] = useState("");
---------------------------------------------
    useEffect(() => {
        if (val.length >= 3) {
            axios.get(`/searchCards/${val}.json`).then(results => {});
        } else if (val.length <= 3) {
            setCard("");
        }
    }, [val]);
---------------------------------------------
 function handleChange(e) {
    e.preventDefault();
    setVal(e.target.value);
  }

----------------------------------------------
   <form noValidate onSubmit={e => this.submit(e)}>
            <input
              noValidate
              name="searchValue"
              placeholder="name"
              onChange={e => handleChange(e)}
            />
            <br />
            <br />
            <input onChange={e => handleChange(e)} type="date" />
          </form>

node.js

app.get("/searchCards/:str.json", (req, res) => {
    db.findCard(req.params.str)
        .then(results => {
            let result = results.rows[0].name;
            res.json({ result });
        })
        .catch(err => {
            console.log("error in searching for cards by name: ", err.message);
            res.json(null);
        });
});

exports.findCard = function findCard(str) {
    return db.query(`SELECT * FROM cards WHERE name ILIKE $1 LIMIT 1`, [
        str + "%"
    ]);
};

Как можно добиться того же с помощью redux-saga, поиска в хранилище по значению и возврата всего объекта, содержащего это значение?


РЕШЕНИЕ

Я нашел обходной путь, если кто-то хочет знать. Документация по redux-saga не очень богата, поэтому я сделал это только так, как знал.

По сути, когда компонент монтируется, я запрашиваю данные из API и сохраняю в хранилище redux. Как только он находится в магазине, я отображаю его на FE.

Так как при изменении поля ввода я хочу отображать только некоторые части ранее отображенных данных, я сделал троичный, который говорит, что еслизначение поля ввода существует / изменяется, отображается через хранилище и возвращается туда, где input value.toLowerCase (). startWithstartsWith (value_in_the_store), иначе возвращает все данные.

Работает как чудо.

Если у кого-то есть другая идея, я хотел бы услышать.

1 Ответ

0 голосов
/ 02 декабря 2019

РЕШЕНИЕ

Я нашел обходной путь, если кто-то хочет знать. Документация по redux-saga не очень богата, поэтому я сделал это только так, как я знал.

По сути, когда компонент монтируется, я запрашиваю данные из API и сохраняю в хранилище redux. Как только он находится в магазине, я отображаю его на FE.

Так как при изменении поля ввода я хочу отображать только некоторые части ранее отображенных данных, я сделал троичный, который говорит, что еслизначение поля ввода существует / изменяется, отображается через хранилище и возвращается туда, где input value.toLowerCase (). startWithstartsWith (value_in_the_store), иначе возвращает все данные.

Работает как шарм.

Если у кого-то есть другая идея, я хотел бы услышать.

...