Javascript 如何多次渲染React组件,但每次都使用更新的状态?
所以我在做一个react项目。我有一个文本区域,在其中输入数据,然后对数据进行散列,每当单击按钮时,屏幕上就会呈现一个包含块号、散列数据和时间的块。但是,当我再次输入数据并再次按下按钮时,它只是将块重新命名为块号2。我希望上一个块保持在屏幕上,并在单击按钮时在上一个块下方渲染一个新块。我如何解决这个问题?我试了很多,但似乎什么都不管用。我正处于react的学习阶段,如果这个问题看起来很琐碎,请原谅 App.jsJavascript 如何多次渲染React组件,但每次都使用更新的状态?,javascript,html,reactjs,Javascript,Html,Reactjs,所以我在做一个react项目。我有一个文本区域,在其中输入数据,然后对数据进行散列,每当单击按钮时,屏幕上就会呈现一个包含块号、散列数据和时间的块。但是,当我再次输入数据并再次按下按钮时,它只是将块重新命名为块号2。我希望上一个块保持在屏幕上,并在单击按钮时在上一个块下方渲染一个新块。我如何解决这个问题?我试了很多,但似乎什么都不管用。我正处于react的学习阶段,如果这个问题看起来很琐碎,请原谅 App.js import React, {Component} from 'react'; im
import React, {Component} from 'react';
import BlockList from './BlockList.js';
import InputText from './InputText.js';
import Button from './Button.js';
constructor() {
super();
console.log('constructor invoked')
this.state = {
blockno:0,
Data:'',
hash:'',
showDiv: false
}
onButtonClick = (event) => {
console.log('onButtonClick invoked')
this.setState({blockno: this.state.blockno + 1, showDiv: true})
}
}
render() {
return(
<div>
<InputText onSearchChange={this.OnSearchChange}/>
<Button onButtonClick={this.onButtonClick} />
{
this.state.showDiv
?
<div>
<BlockList blockno={this.state.blockno} Data={this.state.Data} />
</div>
: ''
}
</div>
);
}
}
export default App;
constructor() {
super();
console.log('constructor invoked')
this.state = {
// To store the list of blocks
blocks: [],
}
}
onButtonClick = (event) => {
console.log('onButtonClick invoked')
let blocks = this.state.blocks
// Create a new block with current data and time
blocks.push({data: this.state.Data, time: Date.time()})
this.setState({blocks})
}
render() {
// other stuff here
{
this.state.blocks.length > 0
?
<div>
<BlockList blocks={this.state.blocks} />
</div>
: ''
}
}
import React,{Component}来自'React';
从“./BlockList.js”导入区块列表;
从“./InputText.js”导入InputText;
从“./Button.js”导入按钮;
构造函数(){
超级();
console.log('调用了构造函数')
此.state={
区块编号:0,
数据:“”,
散列:“”,
showDiv:错
}
onButtonClick=(事件)=>{
console.log('onButtonClick invoked')
this.setState({blockno:this.state.blockno+1,showDiv:true})
}
}
render(){
返回(
{
this.state.showDiv
?
: ''
}
);
}
}
导出默认应用程序;
Block.js
import React from 'react';
import SHA256 from 'sha256-es';
const Block = ({blockno,Data}) => {
const hashdata = () =>{
return(
SHA256.hash(Data)
);
}
var today = new Date();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = mm + '/' + dd + '/' + yyyy;
return(
<div className="tc ws-pre">
<h1 className="underline">Block {blockno}</h1>
<h2>Data: {Data}</h2>
<h2>Hash: {hashdata()}</h2>
<h2>Date: {today}</h2>
</div>
);
}
export default Block
从“React”导入React;
从“SHA256 es”导入SHA256;
常量块=({blockno,Data})=>{
常量hashdata=()=>{
返回(
SHA256.hash(数据)
);
}
var today=新日期();
var dd=String(today.getDate()).padStart(2,'0');
var mm=String(today.getMonth()+1).padStart(2,'0');//一月是0!
var yyyy=today.getFullYear();
今天=mm+'/'+dd+'/'+yyyy;
返回(
块{blockno}
数据:{Data}
哈希:{hashdata()}
日期:{今天}
);
}
导出默认块
BlockList.js
import React from 'react';
import Block from './Block.js';
const BlockList = ({blockno,Data,isBlockUpdated}) => {
const BlockItems = () => {
return(
<div>
{console.log('A block item is now returned')}
<Block blockno={blockno} Data={Data} />
</div>
);
}
return(
<div>
<BlockItems />
</div>
);
}
export default BlockList
const BlockList = ({blocks,Data,isBlockUpdated}) => {
// other stuff here
return(
<div>
{blocks.map((block, index) => <BlockItem {...block} blockno={index} />)}
</div>
);
}
从“React”导入React;
从“/Block.js”导入块;
常量块列表=({blockno,Data,isBlockUpdated})=>{
常量块项=()=>{
返回(
{console.log('现在返回一个块项')}
);
}
返回(
);
}
导出默认阻止列表
每次单击按钮时,我都想在上一个块的下方显示一个新块。我刚刚快速浏览了一下。因此,每次按下App.js中的按钮,都会在状态中向
blockno
添加1。这只是一个数字,所以这个数字只是被更新并传递到Block.js中
如果要显示多个块,则需要创建一个可以迭代的数组,并为每个块显示一个块组件
本质上,你的状态应该是这样的:
blocks: [{ block data here }]
{blocks.map(block => (
<Block data={block.data} />
))}
onButtonClick然后需要向该数组添加一个对象。然后您可以将该数组向下传递到BlockList,并在那里进行迭代
区块列表的外观如下所示:
blocks: [{ block data here }]
{blocks.map(block => (
<Block data={block.data} />
))}
{blocks.map(block=>(
))}
这有意义吗?我刚刚浏览了一下。因此,每次按下App.js中的按钮,都会在状态中向
blockno
添加1。这只是一个数字,所以这个数字只是被更新并传递到Block.js中
如果要显示多个块,则需要创建一个可以迭代的数组,并为每个块显示一个块组件
本质上,你的状态应该是这样的:
blocks: [{ block data here }]
{blocks.map(block => (
<Block data={block.data} />
))}
onButtonClick然后需要向该数组添加一个对象。然后您可以将该数组向下传递到BlockList,并在那里进行迭代
区块列表的外观如下所示:
blocks: [{ block data here }]
{blocks.map(block => (
<Block data={block.data} />
))}
{blocks.map(block=>(
))}
这有意义吗?正如DanBonehill的回答,您需要一个数组来存储块 App.js
import React, {Component} from 'react';
import BlockList from './BlockList.js';
import InputText from './InputText.js';
import Button from './Button.js';
constructor() {
super();
console.log('constructor invoked')
this.state = {
blockno:0,
Data:'',
hash:'',
showDiv: false
}
onButtonClick = (event) => {
console.log('onButtonClick invoked')
this.setState({blockno: this.state.blockno + 1, showDiv: true})
}
}
render() {
return(
<div>
<InputText onSearchChange={this.OnSearchChange}/>
<Button onButtonClick={this.onButtonClick} />
{
this.state.showDiv
?
<div>
<BlockList blockno={this.state.blockno} Data={this.state.Data} />
</div>
: ''
}
</div>
);
}
}
export default App;
constructor() {
super();
console.log('constructor invoked')
this.state = {
// To store the list of blocks
blocks: [],
}
}
onButtonClick = (event) => {
console.log('onButtonClick invoked')
let blocks = this.state.blocks
// Create a new block with current data and time
blocks.push({data: this.state.Data, time: Date.time()})
this.setState({blocks})
}
render() {
// other stuff here
{
this.state.blocks.length > 0
?
<div>
<BlockList blocks={this.state.blocks} />
</div>
: ''
}
}
constructor(){
超级();
console.log('调用了构造函数')
此.state={
//存储块列表的步骤
区块:[],
}
}
onButtonClick=(事件)=>{
console.log('onButtonClick invoked')
设blocks=this.state.blocks
//使用当前数据和时间创建新块
blocks.push({data:this.state.data,time:Date.time()})
this.setState({blocks})
}
render(){
//这里还有其他东西
{
this.state.blocks.length>0
?
: ''
}
}
BlockList.js
import React from 'react';
import Block from './Block.js';
const BlockList = ({blockno,Data,isBlockUpdated}) => {
const BlockItems = () => {
return(
<div>
{console.log('A block item is now returned')}
<Block blockno={blockno} Data={Data} />
</div>
);
}
return(
<div>
<BlockItems />
</div>
);
}
export default BlockList
const BlockList = ({blocks,Data,isBlockUpdated}) => {
// other stuff here
return(
<div>
{blocks.map((block, index) => <BlockItem {...block} blockno={index} />)}
</div>
);
}
const BlockList=({blocks,Data,isBlockUpdated})=>{
//这里还有其他东西
返回(
{blocks.map((块,索引)=>)}
);
}
正如DanBonehill的回答,您需要一个数组来存储块
App.js
import React, {Component} from 'react';
import BlockList from './BlockList.js';
import InputText from './InputText.js';
import Button from './Button.js';
constructor() {
super();
console.log('constructor invoked')
this.state = {
blockno:0,
Data:'',
hash:'',
showDiv: false
}
onButtonClick = (event) => {
console.log('onButtonClick invoked')
this.setState({blockno: this.state.blockno + 1, showDiv: true})
}
}
render() {
return(
<div>
<InputText onSearchChange={this.OnSearchChange}/>
<Button onButtonClick={this.onButtonClick} />
{
this.state.showDiv
?
<div>
<BlockList blockno={this.state.blockno} Data={this.state.Data} />
</div>
: ''
}
</div>
);
}
}
export default App;
constructor() {
super();
console.log('constructor invoked')
this.state = {
// To store the list of blocks
blocks: [],
}
}
onButtonClick = (event) => {
console.log('onButtonClick invoked')
let blocks = this.state.blocks
// Create a new block with current data and time
blocks.push({data: this.state.Data, time: Date.time()})
this.setState({blocks})
}
render() {
// other stuff here
{
this.state.blocks.length > 0
?
<div>
<BlockList blocks={this.state.blocks} />
</div>
: ''
}
}
constructor(){
超级();
console.log('调用了构造函数')
此.state={
//存储块列表的步骤
区块:[],
}
}
onButtonClick=(事件)=>{
console.log('onButtonClick invoked')
设blocks=this.state.blocks
//使用当前数据和时间创建新块
blocks.push({data:this.state.data,time:Date.time()})
this.setState({blocks})
}
render(){
//这里还有其他东西
{
this.state.blocks.length>0
?
: ''
}
}
BlockList.js
import React from 'react';
import Block from './Block.js';
const BlockList = ({blockno,Data,isBlockUpdated}) => {
const BlockItems = () => {
return(
<div>
{console.log('A block item is now returned')}
<Block blockno={blockno} Data={Data} />
</div>
);
}
return(
<div>
<BlockItems />
</div>
);
}
export default BlockList
const BlockList = ({blocks,Data,isBlockUpdated}) => {
// other stuff here
return(
<div>
{blocks.map((block, index) => <BlockItem {...block} blockno={index} />)}
</div>
);
}
const BlockList=({blocks,Data,isBlockUpdated})=>{
//这里还有其他东西
返回(
{blocks.map((块,索引)=>)}
);
}
您的区块列表实际上只有一个区块。我现在没有时间找出并键入完整的工作代码段,但您需要做的是将一个块ID数组传递给该组件(并在每次适当的操作发生时添加到该组件),并在其上映射
以呈现多个块
组件。您的块列表实际上只有一个块。我现在没有时间找出并键入完整的工作代码