- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好!我在这里列出了这个问题的更简洁示例:Need Help Creating a Simple List Maker App in React JS
我正在研究React,并为我的投资组合构建一个简单的列表制作器应用程序。但是我卡住了!我正在尝试为输入表单和按钮创建功能,当单击它们时,会将信息添加到页面正文的列表中。当我研究dom操作时,我先做了一个getElementByTagName然后是li.appendChild等。但是现在我不知道如何在React中做到这一点,因为从我的阅读中,您不应该在react中进行dom操作。谁能帮助我通过创建适当的功能来允许按钮将内容添加到列表中吗?并删除项目吗?到目前为止,这是我的代码:
import React, { Component } from 'react';
import './App.css';
import Navigation from './components/Navigation';
import ListInput from './components/ListInput';
import ListName from './components/ListName';
class App extends Component {
constructor() {
super();
this.state = {
input: '',
items: []
};
}
addItem = () => {
this.setState(state => {
let inputValue = this.input.current.value;
if (inputValue !== '') {
this.setState({
items: [this.state.items, inputValue]
})
}
})
}
onButtonEnter = () => {
this.addItem();
}
render() {
return (
<div className="App">
<Navigation />
<ListName />
<ListInput addItem={this.addItem}
onButtonEnter={this.onButtonEnter} />
</div>
);
}
}
export default App;
import React from "react";
import "./ListInput.css";
const ListInput = ({ addItem, onButtonEnter }) => {
return (
<div>
<p className="center f2">{"Enter List Item"}</p>
<div className="center">
<div className="center f3 br-6 shadow-5 pa3 ">
<input
type="text"
className="f4 pa2 w-70 center"
placeholder="Enter Here"
/>
<button
className="w-30 grow f4 link ph3 pv2 dib white bg-black"
onClick={onButtonEnter}
onSubmit={addItem}
>
{"Enter"}
</button>
</div>
</div>
</div>
);
};
export default ListInput;
最佳答案
在react
中,我们使用声明性方式编写代码。
我们得到一个state
来保存我们的数据并充当我们的真理之源
我们获得了返回可视化效果的组件和功能
根据当前的state
因此,如果您有Items
的列表并要显示它们,则将在该列表上循环并为每个项目返回Item
的直观表示。
当您要添加或删除项目时,只需在该状态下从该列表添加或删除项目。
这是这种用法的一个运行示例:
class Item extends React.Component {
remove = () => {
const { id, onRemove } = this.props;
onRemove(id);
};
render() {
const { text } = this.props;
return (
<div style={{ display: "flex" }}>
<button onClick={this.remove}>Remove</button>
<div>{text}</div>
</div>
);
}
}
class App extends React.Component {
state = {
items: [
{ id: 1, text: "item 1" },
{ id: 2, text: "item 2" },
{ id: 3, text: "item 3" }
]
};
addItem = () => {
this.setState(state => {
const { items } = state;
const newId = uuid();
const newItem = { id: newId, text: `item ${newId}` };
return {
items: [...items, newItem]
};
});
};
onItemRemove = itemId => {
this.setState(state => {
const { items } = state;
const filteredItems = items.filter(item => item.id !== itemId);
return {
items: filteredItems
};
});
};
render() {
const { items } = this.state;
return (
<div>
<div>
<button onClick={this.addItem}>Add Item</button>
<hr />
</div>
{items.map(item => (
<Item
key={item.id}
id={item.id}
text={item.text}
onRemove={this.onItemRemove}
/>
))}
</div>
);
}
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/node-uuid/1.4.8/uuid.js"></script>
<div id="root"/>
Form
来让用户输入文本并添加一个新的
Item
。
<Item />
组件。
text
道具,它看起来像这样:
const Item = ({text}) => <div>{text}</div>
react
中的常见任务,我们大多使用
Array.prototype.map来完成。所以我们的组件看起来像这样:
const ItemList = ({ items }) => (
<div>
{
items.map(item => <Item key={item.id} text={item.text} />)
}
</div>
)
ItemList
。
React.Component
类:
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
render() {
const { items } = this.state;
return <ItemList items={items} />;
}
}
const Item = ({ text }) => <div>{text}</div>;
const ItemList = ({ items }) => (
<div>{items.map(item => <Item key={item.id} text={item.text} />)}</div>
);
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
render() {
const { items } = this.state;
return <ItemList items={items} />;
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<ItemListContainer />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root" />
addItem
函数。
input
。
button
以触发
addItem
功能。
input
,并且
button
可以将其称为
ItemForm
。
ItemForm
是否需要处理添加项的逻辑? (提示不!)。
ItemListContainer
。这是我们编写
addItem
函数的地方。
ItemForm
中获取输入文本,并且仅在单击提交
button
时才需要。
ItemForm
的状态。它将管理输入的更改文本,并在提交时触发传递给它的回调。
class ItemForm extends React.Component {
state = { value: "" };
onValueChange = ({ target }) => this.setState({ value: target.value });
onSubmit = () => {
const { onSubmit } = this.props;
const { value } = this.state;
// just validating empty strings
if (!value) return;
// clearing the input field
this.setState({ value: "" });
// passing the value to the callback from props
onSubmit(value);
};
render() {
const { value } = this.state;
return (
<div>
<input
placeholder="enter item text"
type="text"
value={value}
onChange={this.onValueChange}
/>
<button onClick={this.onSubmit}>Submit</button>
</div>
);
}
}
ItemForm
中渲染
ItemListContainer
。
addItem
函数以记录该值以查看其工作原理:
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
addItem = value => {
console.log(value);
}
render() {
const { items } = this.state;
return (
<div>
<ItemForm onSubmit={this.addItem} />
<ItemList items={items} />
</div>
);
}
}
const Item = ({ text }) => <div>{text}</div>;
const ItemList = ({ items }) => (
<div>{items.map(item => <Item key={item.id} text={item.text} />)}</div>
);
class ItemForm extends React.Component {
state = { value: "" };
onValueChange = ({ target }) => this.setState({ value: target.value });
onSubmit = () => {
const { onSubmit } = this.props;
const { value } = this.state;
// just validating empty strings
if (!value) return;
// clearing the input field
this.setState({ value: "" });
// passing the value to the callback from props
onSubmit(value);
};
render() {
const { value } = this.state;
return (
<div>
<input
placeholder="enter item text"
type="text"
value={value}
onChange={this.onValueChange}
/>
<button onClick={this.onSubmit}>Submit</button>
</div>
);
}
}
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
addItem = value => {
console.log(value);
}
render() {
const { items } = this.state;
return (
<div>
<ItemForm onSubmit={this.addItem} />
<ItemList items={items} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<ItemListContainer />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root" />
addItem
逻辑。众所周知,项目是处于状态的数组,如果要添加新项目,我们要做的就是将其添加到数组中。
this.state.push(newItem)
,因为这会改变数组,这在我们的反应世界中是一个很大的禁忌。
addItem
函数可能如下所示:
addItem = value => {
this.setState(state => {
const { items } = state;
// watch it we are missing an id property here!!!
const newItem = { text: value };
return {
items: [...items, newItem]
};
});
};
item
作为
value
属性创建一个新的
text
。但是请注意,我们没有提供
id
属性,对于
key
的
<Item />
道具我们将需要它,并且稍后在我们要删除
item
时将需要它(我们将基于在
id
上)。
uuid
):
const Item = ({ text }) => <div>{text}</div>;
const ItemList = ({ items }) => (
<div>{items.map(item => <Item key={item.id} text={item.text} />)}</div>
);
class ItemForm extends React.Component {
state = { value: "" };
onValueChange = ({ target }) => this.setState({ value: target.value });
onSubmit = () => {
const { onSubmit } = this.props;
const { value } = this.state;
// just validating empty strings
if (!value) return;
// clearing the input field
this.setState({ value: "" });
// passing the value to the callback from props
onSubmit(value);
};
render() {
const { value } = this.state;
return (
<div>
<input
placeholder="enter item text"
type="text"
value={value}
onChange={this.onValueChange}
/>
<button onClick={this.onSubmit}>Submit</button>
</div>
);
}
}
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
addItem = value => {
this.setState(state => {
const { items } = state;
const newId = uuid();
const newItem = { text: value, id: newId };
return {
items: [...items, newItem]
};
});
};
render() {
const { items } = this.state;
return (
<div>
<ItemForm onSubmit={this.addItem} />
<ItemList items={items} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<ItemListContainer />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/node-uuid/1.4.8/uuid.js"></script>
<div id="root" />
button
旁边删除一个
Item
。
removeItem
函数,它将接受与之相关的ID
item
。
Item
组件。
const Item = ({ text, onRemove }) => (
<div>
<button onClick={onRemove}>X</button>
{text}
</div>
);
Item
现在都收到另一个道具
onRemove
。
ItemList
的组件
Item
中传递出去:
const ItemList = ({ items, onRemove }) => (
<div>
{items.map(item => (
<Item key={item.id} text={item.text} onRemove={() => onRemove(item.id)} />
))}
</div>
);
ItemList
如何也可以接收
onRemove
道具,而不仅仅是传递它。它使用匿名函数将其向下传递,并传递
id
作为参数。记得?我们说过,我们需要这个
id
才能知道要删除哪个
item
。
ItemListContainer
函数来查看
onRemove
的样子:
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
addItem = value => {
this.setState(state => {
const { items } = state;
const newId = uuid();
const newItem = { text: value, id: newId };
return {
items: [...items, newItem]
};
});
};
onRemove = id => console.log(id);
render() {
const { items } = this.state;
return (
<div>
<ItemForm onSubmit={this.addItem} />
<ItemList items={items} onRemove={this.onRemove} />
</div>
);
}
}
id
只是为了查看其工作情况。
const Item = ({ text, onRemove }) => (
<div>
<button onClick={onRemove}>X</button>
{text}
</div>
);
const ItemList = ({ items, onRemove }) => (
<div>
{items.map(item => (
<Item key={item.id} text={item.text} onRemove={() => onRemove(item.id)} />
))}
</div>
);
class ItemForm extends React.Component {
state = { value: "" };
onValueChange = ({ target }) => this.setState({ value: target.value });
onSubmit = () => {
const { onSubmit } = this.props;
const { value } = this.state;
// just validating empty strings
if (!value) return;
// clearing the input field
this.setState({ value: "" });
// passing the value to the callback from props
onSubmit(value);
};
render() {
const { value } = this.state;
return (
<div>
<input
placeholder="enter item text"
type="text"
value={value}
onChange={this.onValueChange}
/>
<button onClick={this.onSubmit}>Submit</button>
</div>
);
}
}
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
addItem = value => {
this.setState(state => {
const { items } = state;
const newId = uuid();
const newItem = { text: value, id: newId };
return {
items: [...items, newItem]
};
});
};
onRemove = id => console.log(id);
render() {
const { items } = this.state;
return (
<div>
<ItemForm onSubmit={this.addItem} />
<ItemList items={items} onRemove={this.onRemove} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<ItemListContainer />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/node-uuid/1.4.8/uuid.js"></script>
<div id="root" />
onRemove = id => {
this.setState(state => {
const { items } = state;
const filteredItems = items.filter(item => item.id !== id);
return { items: filteredItems };
});
};
const Item = ({ text, onRemove }) => (
<div>
<button onClick={onRemove}>X</button>
{text}
</div>
);
const ItemList = ({ items, onRemove }) => (
<div>
{items.map(item => (
<Item key={item.id} text={item.text} onRemove={() => onRemove(item.id)} />
))}
</div>
);
class ItemForm extends React.Component {
state = { value: "" };
onValueChange = ({ target }) => this.setState({ value: target.value });
onSubmit = () => {
const { onSubmit } = this.props;
const { value } = this.state;
// just validating empty strings
if (!value) return;
// clearing the input field
this.setState({ value: "" });
// passing the value to the callback from props
onSubmit(value);
};
render() {
const { value } = this.state;
return (
<div>
<input
placeholder="enter item text"
type="text"
value={value}
onChange={this.onValueChange}
/>
<button onClick={this.onSubmit}>Submit</button>
</div>
);
}
}
class ItemListContainer extends React.Component {
state = {
// starting with 2 items
items: [{ id: 1, text: "item 1" }, { id: 2, text: "item 2" }]
};
addItem = value => {
this.setState(state => {
const { items } = state;
const newId = uuid();
const newItem = { text: value, id: newId };
return {
items: [...items, newItem]
};
});
};
onRemove = id => {
this.setState(state => {
const { items } = state;
const filteredItems = items.filter(item => item.id !== id);
return { items: filteredItems };
});
};
render() {
const { items } = this.state;
return (
<div>
<ItemForm onSubmit={this.addItem} />
<ItemList items={items} onRemove={this.onRemove} />
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<ItemListContainer />, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/node-uuid/1.4.8/uuid.js"></script>
<div id="root"/>
关于javascript - 如何在React中创建appenChild或删除按钮功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52523264/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
所以我用 Create React App 创建并设置了一个大型 React 应用程序。最近我们开始使用 Storybook 来处理和创建组件。它很棒。但是,当我们尝试运行或构建应用程序时,我们不断遇
遵循我正在创建的控件的代码片段。这个控件用在不同的地方,变量也不同。 我正在尝试编写指令来清理代码,但在 {{}} 附近插入值时出现解析错误。 刚接触 Angular ,无法确定我错过了什么。请帮忙。
我正在尝试创建一个 image/jpeg jax-rs 提供程序类,它为我的基于 post rest 的 Web 服务创建一个图像。我无法制定请求来测试以下内容,最简单的测试方法是什么? @POST
我一直在 Windows 10 的模拟器中练习 c。后来我改用dev C++ IDE。当我在 C 中使用 FILE 时。创建的文件的名称为 test.txt ,而我给出了其他名称。请帮助解决它。 下面
当我们创建自定义 View 时,我们将 View 文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。 当我们创建 customUITable
我正在尝试为函数 * Producer 创建一个线程,但用于创建线程的行显示错误。我为这句话加了星标,但我无法弄清楚它出了什么问题...... #include #include #include
今天在做项目时,遇到了需要创建JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的文章,看后跟着打了一遍代码。感觉方法挺好的,在这里与大家分享一下。 &
我正在阅读将查询字符串传递给 Amazon 的 S3 以进行身份验证的文档,但似乎无法理解 StringToSign 的创建和使用方式。我正在寻找一个具体示例来说明 (1) 如何构造 String
前言:我对 C# 中任务的底层实现不太了解,只了解它们的用法。为我在下面屠宰的任何东西道歉: 对于“我怎样才能开始一项任务但不等待它?”这个问题,我找不到一个好的答案。在 C# 中。更具体地说,即使任
我有一个由一些复杂的表达式生成的 ILookup。假设这是按姓氏查找人。 (在我们简单的世界模型中,姓氏在家庭中是唯一的) ILookup families; 现在我有两个对如何构建感兴趣的查询。 首
我试图创建一个 MSI,其中包含 和 exe。在 WIX 中使用了捆绑选项。这样做时出错。有人可以帮我解决这个问题。下面是代码: 错误 error LGH
在 Yii 中,Create 和 Update 通常使用相同的形式。因此,如果我在创建期间有电子邮件、密码、...other_fields...等字段,但我不想在更新期间专门显示电子邮件和密码字段,但
上周我一直在努力创建一个给定一行和一列的 QModelIndex。 或者,我会满足于在已经存在的 QModelIndex 中更改 row() 的值。 任何帮助,将不胜感激。 编辑: QModelInd
出于某种原因,这不起作用: const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
在今天之前,我使用/etc/vim/vimrc来配置我的vim设置。今天,我想到了创建.vimrc文件。所以,我用 touch .vimrc cat /etc/vim/vimrc > .vimrc 所
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
在以下代码中,第一个日志语句按预期显示小数,但第二个日志语句记录 NULL。我做错了什么? NSDictionary *entry = [[NSDictionary alloc] initWithOb
我正在使用与此类似的代码动态添加到数组; $arrayF[$f+1][$y][$x+1] = $value+1; 但是我在错误报告中收到了这个: undefined offset :1 问题:尝试创
我是一名优秀的程序员,十分优秀!