如何在ReactJs中的onClick事件上回调函数

时间:2019-03-02 06:08:06

标签: reactjs

我有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
  }))
 }
 }

1 个答案:

答案 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>
  }
}