Props 在 Reactjs 中被证明是未定义的
Props turns out to be undefined in Reactjs
您好,我正在尝试根据 Props 的值为我的应用设置 setState 我依赖于 prop 的值作为我的状态,但是当我将函数传递给 setState 时,我收到的 props 是未定义的,不知道为什么,我跟着this document做参考。您可以阅读 状态更新可能是异步的 部分
下面是我的代码(来自文件 Form.js 的代码片段)
this.props.setTodos(function (_, props) {
console.log("this is props:" + props);
return [
...props.todos,
{ text: props.inputText, completed: false, id: Math.random() * 1000 },
];
});
我传递道具的 App.js 文件的代码
import "./App.css";
import Form from "./components/Form";
import TodoList from "./components/TodoList";
import React, { useState } from "react";
function App() {
const [inputText, setText] = useState("");
const [todos, setTodos] = useState([]);
return (
<div className="App">
<header>
<h1>My Todolist </h1>
</header>
<Form
todos={todos}
setTodos={setTodos}
setText={setText}
inputText={inputText}
/>
<TodoList />
</div>
);
}
export default App;
Form.js 文件的完整代码
import React from "react";
class Form extends React.Component {
constructor(props) {
super(props);
}
handler = (e) => {
// console.log(e.target.value);
this.props.setText(e.target.value);
};
submitTodoHandler = (e) => {
e.preventDefault();
this.props.setTodos(function (_, props) {
console.log("this is props:" + props);
return [
...props.todos,
{ text: props.inputText, completed: false, id: Math.random() * 1000 },
];
});
};
render() {
return (
<div>
<form>
<input onChange={this.handler} type="text" className="todo-input" />
<button
onClick={this.submitTodoHandler}
className="todo-button"
type="submit"
>
<i className="fas fa-plus-square"></i>
</button>
<div className="select">
<select name="todos" className="filter-todo">
<option value="all">All</option>
<option value="completed">Completed</option>
<option value="uncompleted">Uncompleted</option>
</select>
</div>
</form>
</div>
);
}
}
export default Form;
我不知道为什么我的道具是未定义的?谢谢
您需要做的是更改 <Form>
组件中的 submitTodoHandler
功能:
submitTodoHandler = (e) => {
e.preventDefault();
console.log(this.props.inputText) // outputs what you typed in the input
this.props.setTodos(this.props.inputText);
};
您在功能组件中定义 setState 并将其作为 prop 传递给 class 组件。功能组件中的 setState 挂钩与您引用的 class 组件中的 setState 行为略有不同。
在功能组件中,setState(或您的情况下的 setTodos)只需使用 setState(newVariableValue)
即可更改变量的状态,并接受先前状态作为参数。由于 newVariableValue 通过 prop (inputText) 从 <App>
组件传递到 <Form>
组件,您可以直接使用 this.props.inputText
.
访问它
您好,我正在尝试根据 Props 的值为我的应用设置 setState 我依赖于 prop 的值作为我的状态,但是当我将函数传递给 setState 时,我收到的 props 是未定义的,不知道为什么,我跟着this document做参考。您可以阅读 状态更新可能是异步的 部分 下面是我的代码(来自文件 Form.js 的代码片段)
this.props.setTodos(function (_, props) {
console.log("this is props:" + props);
return [
...props.todos,
{ text: props.inputText, completed: false, id: Math.random() * 1000 },
];
});
我传递道具的 App.js 文件的代码
import "./App.css";
import Form from "./components/Form";
import TodoList from "./components/TodoList";
import React, { useState } from "react";
function App() {
const [inputText, setText] = useState("");
const [todos, setTodos] = useState([]);
return (
<div className="App">
<header>
<h1>My Todolist </h1>
</header>
<Form
todos={todos}
setTodos={setTodos}
setText={setText}
inputText={inputText}
/>
<TodoList />
</div>
);
}
export default App;
Form.js 文件的完整代码
import React from "react";
class Form extends React.Component {
constructor(props) {
super(props);
}
handler = (e) => {
// console.log(e.target.value);
this.props.setText(e.target.value);
};
submitTodoHandler = (e) => {
e.preventDefault();
this.props.setTodos(function (_, props) {
console.log("this is props:" + props);
return [
...props.todos,
{ text: props.inputText, completed: false, id: Math.random() * 1000 },
];
});
};
render() {
return (
<div>
<form>
<input onChange={this.handler} type="text" className="todo-input" />
<button
onClick={this.submitTodoHandler}
className="todo-button"
type="submit"
>
<i className="fas fa-plus-square"></i>
</button>
<div className="select">
<select name="todos" className="filter-todo">
<option value="all">All</option>
<option value="completed">Completed</option>
<option value="uncompleted">Uncompleted</option>
</select>
</div>
</form>
</div>
);
}
}
export default Form;
我不知道为什么我的道具是未定义的?谢谢
您需要做的是更改 <Form>
组件中的 submitTodoHandler
功能:
submitTodoHandler = (e) => {
e.preventDefault();
console.log(this.props.inputText) // outputs what you typed in the input
this.props.setTodos(this.props.inputText);
};
您在功能组件中定义 setState 并将其作为 prop 传递给 class 组件。功能组件中的 setState 挂钩与您引用的 class 组件中的 setState 行为略有不同。
在功能组件中,setState(或您的情况下的 setTodos)只需使用 setState(newVariableValue)
即可更改变量的状态,并接受先前状态作为参数。由于 newVariableValue 通过 prop (inputText) 从 <App>
组件传递到 <Form>
组件,您可以直接使用 this.props.inputText
.