#javascript #reactjs #react-hooks #use-state
#javascript #reactjs #реагирующие хуки #use-state
Вопрос:
В настоящее время объект для вошедшего в систему пользователя установлен в текущее состояние, которое, как вы можете видеть из doe ниже, я ввожу из authContext. Я пытаюсь взять значение user.FirstName и установить его для автора внутри хука useState. Когда я запускаю это внутри своего приложения, я просматриваю базу данных, где хранится объект журнала, но значение автора пустое. Я очень новичок в программировании, поэтому буду признателен за любые советы!
import React, { useState, useContext } from "react";
import M from "materialize-css/dist/js/materialize.min.js";
import LogContext from "../context/logs/logContext";
import AuthContext from "../context/auth/authContext";
const AddLogModal = () => {
const logContext = useContext(LogContext);
const authContext = useContext(AuthContext);
const { user } = authContext;
const { addLog } = logContext;
const [log, setLog] = useState({
title: "",
description: "",
attention: "",
author: user.firstName,
date: new Date(),
});
const { title, description, attention, author } = log;
const onChange = (e) => setLog({ ...log, [e.target.name]: e.target.value });
const onSubmit = (e) => {
e.preventDefault();
if (title === "" || description === "" || attention === "") {
M.toast({ html: "Please enter a title and description.." });
} else {
setLog({ ...log, [e.target.name]: e.target.value });
}
addLog(log);
setLog({
title: "",
description: "",
attention: "",
author: user.firstName,
});
};
return (
<form id="add-log-modal" className="modal" style={modalStyle}>
<div className="modal-content">
<h4>Open New Issue</h4>
<div className="row">
<div className="input-field">
<input type="text" name="title" value={title} onChange={onChange} />
<label htmlFor="message" className="active">
Log Title
</label>
</div>
</div>
<div className="input-field">
<input
type="text"
name="description"
value={description}
onChange={onChange}
/>
<label htmlFor="message" className="active">
Log Description
</label>
</div>
<div className="input-field">
<input type="text" name="author" value={author} onChange={onChange} />
<label htmlFor="message" className="active">
Created By:
</label>
</div>
<div className="row">
<div className="input-field">
<p>
<label>
<input
type="radio"
name="attention"
checked={attention === "Needs Attention"}
value="Needs Attention"
onChange={onChange}
/>
<span>Needs Attention</span>
</label>
</p>
<p>
<label>
<input
type="radio"
name="attention"
checked={attention === "Issue Resolved"}
value="Issue Resolved"
onChange={onChange}
/>
<span>Issue Resolved</span>
</label>
</p>
</div>
</div>
</div>
<div className="modal-footer">
<a
href="#!"
onClick={onSubmit}
className="modal-close waves-effect waves-light blue btn"
>
Enter
</a>
</div>
</form>
);
};
const modalStyle = {
width: "75%",
height: "75%",
};
export default AddLogModal;
AuthContext
import React, { useReducer } from "react";
import axios from "axios";
import AuthContext from "./authContext";
import setAuthToken from "../setAuthToken";
import authReducer from "./authReducer";
import {
REGISTER_SUCCESS,
REGISTER_FAIL,
LOGIN_FAIL,
LOGIN_SUCCESS,
LOGOUT,
USER_LOADED,
AUTH_ERROR,
CLEAR_ERRORS,
} from "../Types";
const AuthState = (props) => {
const initialState = {
token: localStorage.getItem("token"),
isAuthenticated: false,
loading: false,
user: {},
error: null,
};
const [state, dispatch] = useReducer(authReducer, initialState);
// Load User
const loadUser = async () => {
if (localStorage.token) {
setAuthToken(localStorage.token);
}
try {
const res = await axios.get("/api/auth");
dispatch({ type: USER_LOADED, payload: res.data });
} catch (err) {
dispatch({ type: AUTH_ERROR });
}
};
// Register User
const register = async (formData) => {
const config = {
headers: {
"Content-type": "application/json",
},
};
try {
const res = await axios.post("/api/users", formData, config);
dispatch({
type: REGISTER_SUCCESS,
payload: res.data,
});
loadUser();
} catch (err) {
dispatch({
type: REGISTER_FAIL,
payload: err.response.data.msg,
});
}
};
// Login User
const login = async (formData) => {
const config = {
headers: {
"Content-type": "application/json",
},
};
try {
const res = await axios.post("/api/auth", formData, config);
dispatch({
type: LOGIN_SUCCESS,
payload: res.data,
});
loadUser();
} catch (err) {
dispatch({
type: LOGIN_FAIL,
payload: err.response.data.msg,
});
}
};
// Logout
const logout = () => {
dispatch({
type: LOGOUT,
});
};
// Clear Errors
const clearErrors = () => {
dispatch({
type: CLEAR_ERRORS,
});
};
return (
<AuthContext.Provider
value={{
token: state.token,
isAuthenticated: state.isAuthenticated,
loading: state.loading,
user: state.user,
error: state.error,
register,
login,
clearErrors,
loadUser,
logout,
}}
>
{props.children}
</AuthContext.Provider>
);
};
export default AuthState;
Комментарии:
1. В чем именно заключается ваш вопрос? С тем, что вы дали, недостаточно информации. Похоже, что нет вызовов api и нет ничего для обновления базы данных.
2. извините за это. Выше я добавил некоторый код из моего файла authContext, из которого я получаю объект User. Это загружается всякий раз, когда кто-то входит в систему. Чтобы упростить задачу, я пытаюсь просто взять значение FirstName из объекта User и установить его как свойство «author» в хуке useState в первоначально опубликованном коде.
Ответ №1:
Документы React:
Пример реакции:
<button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>