我有handleClick
事件,通过单击renderDetail
函数必须在{this.state.ShowInfo[i]}
div中运行。我按以下代码进行操作:
我使用了回调,但没有用。
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
data: [],
ShowInfo: {},
}
}
render() {
const { data } = this.state
const renderInfo = data.map((item, i) => {
return (
<div class="item">
<div onClick={e => this.handleClick(e, item, i)}>
<span>Click</span>
</div>
<div>{this.state.ShowInfo[i]}</div>
</div>
)
})
return <div>{renderInfo}</div>
}
handleClick = (e, element, i) => {
fetch('/json.bc', {///I can see that the json.bc is loaded in network tab by result/////
method: 'POST',
})
.then(response => response.text())
.then(text => {
let Maindata = JSON.parse(text.replace(/\'/g, '"'))
this.setState(prevState => ({
ShowInfo: {
...prevState.ShowInfo, [i]: (Maindata, i) => {
console.log(Maindata)// console.log(Maindata) did not show anything.There is no result in this part////
let element = Maindata
let lenfamilies = element.families.length
console.log(lenfamilies)//// console.log(lenfamilies) did not show anything.There is no result in this part////
let indents = [];
for (let j = 0; j < lenfamilies; j++) {
let numF = i
let numS = j
let stingF = numF.toString()
let stingS = numS.toString()
index = stingF + stingS
indents.push(
<div>
<span
key={index}>
</span>
</div>
)
}
return (
indents
)
}
},
}))
}).catch(error => console.error(error))
}
}
ReactDOM.render(<App />, document.getElementById("Result"))
<div>{this.state.ShowInfo[i]}</div>
通过使用回调为空。是否有其他方法可以在renderDetail
事件中调用handleClick
函数?
编辑:
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
data: [],
ShowInfo: {},
text: {}
}
}
render() {
const { data } = this.state
const renderInfo = data.map((item, i) => {
return (
<div class="item">
<div onClick={e => this.handleClick(e, item, i)}>
<span>Click</span>
</div>
<div>{this.state.ShowInfo[i]}</div>
</div>
)
})
return <div>{renderInfo}</div>
}
handleClick = (e, element, i) => {
fetch('/json.bc', {
method: 'POST',
},)
.then(response => response.text())
.then(text => {
let Maindata = JSON.parse(text.replace(/\'/g, '"'))
this.setState(prevState => ({
ShowInfo: { ...prevState.ShowInfo,[i]: this.renderDetail(Maindata, i)},
}))
}).catch(error => console.error(error))
}
renderDetail(element, i) {
let lenfamilies = element.families.length
let indents = []
let index = 0
for (let j = 0; j < lenfamilies; j++) {
let numF = i
let numS = j
let stingF = numF.toString()
let stingS = numS.toString()
index = stingF + stingS
indents.push(
<div>
<span
key={index}
onClick={e => this.handleText(e, element.families[j], index)}
>
Click
</span>
<span key={index}>
{this.state.text[index]}
</span>
</div>
)
}
return(
indents
)
}
handleText = (e, element, index) => {
this.setState(prevState => ({
text: { ...prevState.text, [index]: "test" }////In this part 'test' should be set in span but it is not been set
}))
}
}
答案 0 :(得分:1)
这是因为{this.state.ShowInfo[i]}
是一个函数,要执行其主体,您需要使用带有函数名的()
来调用它。
也不要忘记在调用前添加支票,因为this.state.ShowInfo[i]
的初始值是不确定的,并且会因()
引发错误。
用[{notice ()
和ShowInfo[i]
]这样写:
const renderInfo = data.map((item, i) => {
return (
<div class="item">
<div onClick={e => this.handleClick(e, item, i)}>
<span>Click</span>
</div>
{this.state.ShowInfo[i] && <div>{this.state.ShowInfo[i]()}</div>}
</div>
)
})
建议:与其将函数存储在状态变量中,不如仅存储数据并编写通用方法以返回每个键的jsx部分。
检查此代码段:
function print() {
console.log('body of print method');
}
// it will print the function body
console.log(print);
// it will execute the function body
console.log(print());
完整代码:
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
data: [],
showInfoData: {},
text: {},
}
}
handleClick = (e, element, i) => {
fetch('/json.bc', {
method: 'POST',
})
.then(response => response.text())
.then(text => {
let Maindata = JSON.parse(text.replace(/\'/g, '"'));
this.setState(prevState => ({
showInfoData: {
...prevState.showInfoData,
[i]: Maindata,
}
}))
})
.catch(error => console.error(error))
}
showInfo(i) {
let element = this.state.showInfoData[i];
if(!element) return null;
let lenfamilies = element.families.length
let indents = [];
for (let j = 0; j < lenfamilies; j++) {
let numF = i
let numS = j
let stingF = numF.toString()
let stingS = numS.toString()
index = stingF + stingS
indents.push(
<div>
<span
key={index}
onClick={e => this.handleText(e, element.families[j], index)}
>
Click
</span>
<span key={index}>
{this.state.text[index]}
</span>
</div>
)
}
return (indents);
}
handleText = (e, text, i) => {
this.setState(prevState => ({
text: { ...prevState.text, [i]: text}
}))
}
render() {
const { data } = this.state
const renderInfo = data.map((item, i) => {
return (
<div class="item">
<div onClick={e => this.handleClick(e, item, i)}>
<span>Click</span>
</div>
<div>{this.showInfo(i)}</div>
</div>
)
})
return <div>{renderInfo}</div>
}
}