0

我已按如下请求JSON调用:fetch

[{
    "type": "1",
    "First": {
      "nameFirst": "",
      "Id": ""
    }
  },
  {
    "type": "2",
    "Second": [{
        "nameSecond": "",
        "Id": ""
      },
      {
        "nameSecond": "",
        "Id": ""
      },
      {
        "nameSecond": "",
        "Id": ""
      },
      {
        "nameSecond": "",
        "Id": ""
      }
    ]
  }
]

我所做的是找到类型为 1 的对象并将其添加到类型为 2 的对象中。现在它看起来像这样:

[{
    "nameSecond": "",
    "Id": "",
    "First": {
      "nameFirst": "",
      "Id": ""
    }
  },
  {
    "nameSecond": "",
    "Id": "",
    "First": {
      "nameFirst": "",
      "Id": ""
    }
  },
  {
    "nameSecond": "",
    "Id": "",
    "First": {
      "nameFirst": "",
      "Id": ""
    }
  },
  {
    "nameSecond": "",
    "Id": "",
    "First": {
      "nameFirst": "",
      "Id": ""
    }
  }
]

renderthis 的数据中JSON将由{this.renderLibrary()}. 还有一个JSONfetch请求调用的,如下所示:

[{
    "type": "1",
    "First": {
        "nameFirst": "",
        "id": ""
    }
},
{
    "type": "1",
    "First": {
        "nameFirst": "",
        "id": ""
    }
},
{
    "type": "1",
    "First": {
        "nameFirst": "",
        "id": ""
    }
},
{
    "type": "1",
    "First": {
        "nameFirst": "",
        "id": ""
    }
}]

如您所见,JSON上面是由一些对象组成的数组,这些对象看起来是type=1first的对象JSON。在renderthis 的数据中JSON将由{this.renderLibraryFirst()}. 每个对象都JSON包含一个 onclick 函数:

<div onClick={((e) => this.ChangeObjectFirst(e, i))}>Change</div>

我想要的是,当ChangeObjectFirst运行时,单击对象被对象替换并type=1 JSON显示{this.renderLibrary()}新数据。我该如何解决这个问题?这是我的一段代码:

class App extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        data: [],
        dataFlight: [],
        library: null,
        libraryFlight: null,
    }
}
componentDidMount() {
    fetch('/json.bc', {
        method: 'POST',
    })
        .then(response => response.text())
        .then(text => {
            const Maindata = JSON.parse(text.replace(/\'/g, '"'))
            const { First } = Maindata.find(a => a.type === "1") || {}
            const MergedData = Maindata.filter(a => a.type === "2")
                .map(a => {
                    const Second = a.Second.map(b => ({ ...b, First }))
                    return { ...a, Second }
                })
            const MergedDataFinal = MergedData[0].Second
            this.setState(state => ({
                ...state,
                data: MergedDataFinal
            }), () => {
                this.reorganiseLibrary()
            })
        }).catch(error => console.error(error))





        fetch('/new-josn.bc', {
            method: 'POST',
        })
            .then(response => response.text())
            .then(text => {
                const Maindata = JSON.parse(text.replace(/\'/g, '"'))
                this.setState(state => ({
                    ...state,
                    dataFlight: Maindata
                }), () => {
                    this.reorganiseLibraryFlight()
                })
            }).catch(error => console.error(error))

}

reorganiseLibrary = () => {
    const { data } = this.state;
    let library = data;
    library = _.chunk(library);
    this.setState({
        library

    })
}

reorganiseLibraryFlight = () => {
    const { dataFlight } = this.state;
    let libraryFlight = dataFlight
    libraryFlight = _.chunk(libraryFlight);
    this.setState({
        libraryFlight
    })
}

handlePerPage = evt => {
    this.setState({
        perPage: evt.target.value
    }, () => this.reorganiseLibrary());
    this.setState({
        perPage: evt.target.value
    }, () => this.reorganiseLibraryFlight());
}


renderLibrary = () => {
    const { library } = this.state;
    if (!library || (library && library.length === 0)) {
        return <div className="nodata">NoData</div>
    }
    return library.map((item, i) => (
        <div className="Wrapper-List">
            <div><span>{item.First.nameFirst}</span></div>
            <span>{item.nameSecond}</span>
        </div>
    ))
}

renderLibraryFirst = () => {
    const { libraryFlight } = this.state;
    if (!libraryFlight || (libraryFlight && libraryFlight.length === 0)) {
        return ''
    }
    return libraryFlight.map((item, i) => (
        <div className="Wrapper-ChangeObjectFirst">
             <div><span>{item.First.nameFirst}</span></div>
            <div onClick={((e) => this.ChangeObjectFirst(e, i))}>Change</div>
        </div>
    ))
}


render() {
    const { library, libraryFlight } = this.state;
    return (
        <div>
            {this.renderLibrary()}
            {this.renderLibraryFirst()}
        </div>
    )
}
}
ReactDOM.render(<App />, document.getElementById('Result'))

编辑:

class App extends React.Component {
constructor(props) {
    super(props);
    this.state = {
        data: [],
        dataNewJson: [],
        library: null,
        libraryNewJson: null,
        perPage: 5,
        currentPage: 1,
        maxPage: null,
        perPageNewJson: 3,
        currentPageNewJson: 1,
        maxPageNewJson: null,
    }
}
componentDidMount() {
    fetch('/json.bc', {
        method: 'POST',
    })
        .then(response => response.text())
        .then(text => {
            const Maindata = JSON.parse(text.replace(/\'/g, '"'))
            const { First } = Maindata.find(a => a.type === "1") || {}
            const MergedData = Maindata.filter(a => a.type === "2")
                .map(a => {
                    const Second = a.Second.map(b => ({ ...b, First }))
                    return { ...a, Second }
                })
            const MergedDataFinal = MergedData[0].Second
            this.setState(state => ({
                ...state,
                data: MergedDataFinal
            }), () => {
                this.reorganiseLibrary()
            })
        }).catch(error => console.error(error))


    fetch('/new-josn.bc', {
        method: 'POST',
    })
        .then(response => response.text())
        .then(text => {
            const Maindata = JSON.parse(text.replace(/\'/g, '"'))
            this.setState(state => ({
                ...state,
                dataNewJson: Maindata
            }), () => {
                this.reorganiselibraryNewJson()
            })
        }).catch(error => console.error(error))

}

reorganiseLibrary = () => {
    const { perPage, data } = this.state;
    let library = data;
    library = _.chunk(library, perPage);
    this.setState({
        library,
        currentPage: 1,
        maxPage: library.length === 0 ? 1 : library.length
    })
}

reorganiselibraryNewJson = () => {
    const { perPageNewJson, dataNewJson } = this.state;
    let libraryNewJson = dataNewJson
    libraryNewJson = _.chunk(libraryNewJson, perPageNewJson);
    this.setState({
        libraryNewJson,
        currentPageNewJson: 1,
        maxPageNewJson: libraryNewJson.length === 0 ? 1 : libraryNewJson.length
    })
}


handlePerPage = evt => {
    this.setState({
        perPage: evt.target.value
    }, () => this.reorganiseLibrary());
    this.setState({
        perPage: evt.target.value
    }, () => this.reorganiselibraryNewJson());
}


renderLibrary = () => {
    const { library, currentPage } = this.state;
    if (!library || (library && library.length === 0)) {
        return ''
    }
    return library[currentPage - 1].map((item, i) => (
        <span>{item.nameSecond}</span>

    ))
}

renderLibraryFirst = () => {
    const { libraryNewJson, currentPageNewJson } = this.state;
    if (!libraryNewJson || (libraryNewJson && libraryNewJson.length === 0)) {
        return ''
    }
    return libraryNewJson[currentPageNewJson - 1].map((item, i) => (
        <div onClick={((e) => this.ChangeObjectFirst(e, i))}>Change</div>

    ))
}


render() {
    const { library,libraryNewJson } = this.state;
    return (
        <div>
            {this.renderLibrary()}
            {this.renderLibraryFirst()}
        </div>
    )
}
ChangeObjectFirst = (e, i) => {
    const itemToReplace = this.state.libraryNewJson[i];
    console.log(itemToReplace) // It is an array by 3 objects ,because I have  3 pages  
    let { library } = this.state;
    library = library.map(el => {
        el['First'] = Object.assign({}, itemToReplace);
    });
    this.setState({ library: library });
    //// and By clicking there is this error:TypeError: library[(currentPage - 1)] is undefined
}
}
ReactDOM.render(<App />, document.getElementById('Result'))
4

0 回答 0