Проверьте имя пользователя, пароль - Форма входа с использованием React Hooks

Я хочу создать форму входа с массивом данных UsersData.js:

const users = [
  {
    username: 'admin1',
    password: '12345678'
  },
  {
    username:'admin2',
    password:'012345678'
  }
];

и Login.js выглядит примерно так:

import React, {useState} from 'react';
import { users } from 'UsersData';

  function Login() {
      const [data, setData] = useState({
        username: '',
        password: ''
      });
          
      const {uname, pass} = data;
      const checkUser = () => {
        const usercheck = users.find(user => (user.username === uname && user.password === pass));
        if (usercheck) {
          console.info("Login successful");
        }else {
          console.info("Wrong password or username");
        }
        // console.info(uname);
        console.info(usercheck);
      }

      const changeHandler = (e) => {
        setData({...data, [e.target.name]:[e.target.value]})
      }
      const handleSubmit = (e) => {
        e.preventDefault();
        checkUser();
        console.info(checkUser());
      }

    return (
      <div className = "login-bg">
        <div className = "card">
          <form className='loginForm'
          onSubmit = {handleSubmit}
          >
          <div className = "input-text">
              <input
                type = "text"
                name = "username"
                value = {uname}
                placeholder = "Username"
                aria-describedby = "inputGroupPrepend2" required
                onChange = {changeHandler}
              />
          </div>
          <div className = "input-text">
            <input
              type = "password"
              name = "password"
              value = {pass}
              placeholder = "Password"
              aria-describedby = "inputGroupPrepend2" required
              onChange = {changeHandler}
            />
            
          </div>
          <div className = "buttons">
              <button type = "submit" className = "btn btn-warning btn-block">
                Login
              </button>
          </div>
        </form>
        </div>
     </div>
    )
  }
export default Login;

Таким образом, приведенный выше код только проверяет, соответствуют ли поля имени пользователя и пароля, введенные в форму, имени и паролю одной записи в массиве объектов UsersData.js. Приведенный выше код работает нормально. Я написал функцию checkUser(), но результат не правда.

Пожалуйста, покажите пример того, как это делается. Извините, я новичок в ReactJS, поэтому немного запутался, надеюсь, вы поможете. Спасибо

Просто для ясности: вы знаете, что проверка пароля во внешнем интерфейсе совершенно бесполезна ... И checkUser() ничего не возвращает, поэтому его результат undefined добавить return usercheck !== undefined в качестве последнего оператора для возврата true или false

derpirscher 19.03.2022 08:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Привет, осень. Так что способ деструктурирования в первую очередь должен быть значениями, которые вы извлекаете из объекта данных.

Дайте мне знать, является ли это вашей целью?

const { username, password } = data

теперь у нас есть состояние локального компонента имени пользователя и данных

const checkUser = (users) => {
        const usercheck = users.find(user => (user.username === username 
        && user.password === password))
         return usercheck ? console.info('successfully logged in') : 
        console.info('wrong credentials')
 }

затем мы вызываем функцию

checkUser(users)

Я хочу проверить, соответствуют ли поля имени пользователя и пароля, введенные в форму, имени и паролю одной записи в массиве объектов User.js. Я пытался следовать вашему решению. Но результат неверный.

user17746949 19.03.2022 08:57

Да, это также рекомендуется делать на бэкенде, и вы должны проверять пользователей в соответствии с данными, которые они отправляют.

kodamace 19.03.2022 08:57

Попробуйте пользователя Object.keys(checkUser).length ? 1 ?

kodamace 19.03.2022 08:59

вы обновили значения uname и передали значения в форме?

kodamace 19.03.2022 09:00

о нет, прости :v

user17746949 19.03.2022 09:02

@autumnha <input type = "text" name = "username" value = {username} placeholder = "Username" aria-describedby = "inputGroupPrepend2" требуется onChange = {changeHandler} />, а затем также для пароля: D

kodamace 19.03.2022 09:02

проверьте другой ответ, который я отправил, вы каждый раз добавляли массив, а не целевое значение. Я разместил правильное решение для вашей функции handleChangeEvent выше

kodamace 19.03.2022 09:11

@autumnha Я вставил код вверху, и все работает, пожалуйста, проверьте

kodamace 19.03.2022 09:37

Я думаю, вы можете использовать map() и some() для достижения этой цели. Когда вы проверяете, находится ли один из пользователей в массиве, это сгенерирует массив с истинным и ложным, например [ложным, ложным, истинным] и т. д.

Таким образом, наиболее простым решением является сопоставление пользователей с вашими входными значениями, а затем проверка аутентификации с помощью функции some().

const onCheck = () => {
  const {uname, pass} = data;
  const isAuthenticated = users.map(user => user.username === uname && user.password === pass);

  return isAuthenticated.some();
}


if (onCheck()) {
   console.info("Login successful");
}else {
   console.info("Wrong password or username");
}

Представьте, что у нас есть большой список пользователей. Вы не думаете, что лучше найти первого пользователя в списке, чем перебирать их всех? :D

kodamace 19.03.2022 09:45
Ответ принят как подходящий

ваша логика здесь также неверна, так должно быть обработано событие

  import { useEffect, useState } from "react";
import "./styles.css";
const users = [
  {
    username: 'admin1',
    password: '12345678'
  },
  {
    username:'admin2',
    password:'012345678'
  }
];
export default function App() {
  const [data, setData] = useState({
    username: '',
    password: ''
  });
  const changeHandler = (e) => {
    setData({...data, [e.target.name]: e.target.value})
  }

  const checkUser = () => {
    const usercheck = users.find(user => (user.username === data.username && user.password === data.password));
    if (usercheck) {
      console.info("Login successful");
    }else {
      console.info("Wrong password or username");
    }
    // console.info(uname);
    console.info(usercheck);
  }


  useEffect(() => {
checkUser(users)
  }, [data.username, data.password])

  console.info(data)
  return (
    <div className = "App">
      <div className = "input-text">
              <input
                type = "text"
                name = "username"
                value = {data.username}
                placeholder = "Username"
                aria-describedby = "inputGroupPrepend2" required
                onChange = {changeHandler}
              />
          </div>
          <div className = "input-text">
            <input
              type = "password"
              name = "password"
              value = {data.password}
              placeholder = "Password"
              aria-describedby = "inputGroupPrepend2" required
              onChange = {changeHandler}
            />
            
          </div>
    </div>
  );
}

Большое спасибо, ваш метод очень разумен.

user17746949 19.03.2022 09:33

Проверьте это, это должно решить вашу проблему сейчас? просто вместо использования useEffect используйте onsubmit и вызовите checkUser

kodamace 19.03.2022 09:38

да, я знаю, где я ошибся. Спасибо, кодамаче

user17746949 19.03.2022 10:07

Другие вопросы по теме

Получение ошибки в "temparr.get(newwindex) = arr.get(i);" эта строка в коде //получение ошибки в этой строке при преобразовании списка в массив помощь для этого
Я хочу поменять местами символы строки в java, но он возвращает значение мусора, скажите, пожалуйста, что не так с моим кодом?
Почему не работает сортировка в функции setSomething хука useState?
Код для обновления каждого элемента (двоичного) массива на основе голосования большинства последних 5 элементов (включая этот элемент)
Вопрос C++: у меня проблемы с записью массива двойников (32-битная одинарная точность) в файл диска в виде 4-байтового формата IEEE754
Как преобразовать массив JSON в отдельные значения для вставки в мою таблицу SQL?
Есть ли способ добавить другое значение к ключу в объекте в React?
Сделать значения внутри массива javascript условными
Как сгруппировать последовательные данные в массиве 2d в python
Как экспортировать несколько переменных, классов или функций одновременно?