javascript - setState 在反应和传递道具与功能
问题描述
我是新手,刚进入道具和传递函数领域,我的任务是让应用程序与给定组件一起工作,我试图修复它,当你修复某些东西时,我遇到了其中一个时刻你现在不知道发生了什么:)
问题是削减部分主要代码并制作另一个组件:
这是主要的应用程序代码:
import React, { useState } from "react";
import ToDoItem from "./ToDoItem";
import InputArea from "./InputArea";
function App() {
const [inputText, setInputText] = useState("");
const [items, setItems] = useState([]);
function handleChange(event) {
const newValue = event.target.value;
setInputText(newValue);
}
function addItem() {
setItems(prevItems => {
return [...prevItems, inputText];
});
setInputText("");
}
function deleteItem(id) {
setItems(prevItems => {
return prevItems.filter((item, index) => {
return index !== id;
});
});
}
return (
<div className="container">
<div className="heading">
<h1>To-Do List</h1>
</div>
<InputArea
inputText={inputText}
onTyping={handleChange}
addItem={addItem}
/>
<div>
<ul>
{items.map((todoItem, index) => (
<ToDoItem
key={index}
id={index}
text={todoItem}
onChecked={deleteItem}
/>
))}
</ul>
</div>
</div>
);
}
export default App;
这是组件代码:
import React from "react";
function InputArea(props) {
return (
<div className="form">
<input onChange={(e)=>{
props.onTyping(e)
}} type="text" value={props.inputText} />
<button onClick={()=>{
props.addItem()
}}>
<span>Add</span>
</button>
</div>
);
}
export default InputArea;
所以......问题是尝试将输入字段的状态从主应用程序传递到组件,我遇到了const newValue = event.target.value;
未定义的问题,然后我在组件代码中尝试了这个,<input onChange={(e)=>{
props.onTyping(e)
}}
它<input onChange={()=>{
props.onTyping()
}}
以某种方式工作很好,完美!!!,有人可以解释一下为什么以及如何工作吗?
PS:我不擅长写问题,所以请对问题发表任何评论有助于改进我的结构,谢谢。
解决方案
React 具有单向数据绑定,这意味着状态本身是变化的真正来源。您不能更改输入字段中的某些内容并期望它自动更新该字段使用的状态(这种魔法发生在 Angular - 双向数据绑定中)。考虑到这一点,让我们看看你的代码: -
<InputArea
inputText={inputText}
onTyping={handleChange}
addItem={addItem}
/>
该组件有一个输入字段,该字段由其父组件中的状态 propvalue
决定。因此,当您开始在此输入字段中输入内容时,您可能希望更新组件的状态,以便将更改的状态传递给组件。为方便起见,您已将别名作为道具传递。现在,您将此道具绑定到输入字段上的处理程序,该处理程序在您输入字段时触发。所以现在你只需要确保将对象传递给处理程序。这将使用该对象调用您,现在您可以使用并将其设置为您的.inputText
App
inputText
App
props
InputArea
handleChange
onTyping
onChange
event
onTyping
handleChange
event
event.target.value
inputText
你可以改变
<input onChange={(e)=>
props.onTyping(e)
}
到
<input onChange={
props.onTyping
}
它会以同样的方式工作。在第二种风格中,event
对象是隐式传递的。
推荐阅读
- excel - 将数据框从 Python 导出到 excel csv
- numpy - 从稀疏矩阵中获取过滤后的共现
- snowflake-cloud-data-platform - 在雪花中有没有办法在没有数据的情况下克隆数据库、模式或表?
- javascript - 当一个元素在另一个元素之上时触发一个事件
- dataframe - 拆分数据框的列
- rust - 是否可以使用功能标志进行条件特征继承(例如发送 + 同步)?
- image - 如何使图像适合 Flutter 中的列宽?
- mongodb - 通过部署更新而不是显式传递选项来修复 Mongo RetryableWrites?
- javascript - 调用函数时对 js 表示法感到困惑
- c# - 将项目从 VB.Net 转换为 C# 后,不会触发用 .cs 页面编写的事件