I have a React functional component that does the following:
import React, { useEffect, useState } from "react";
import axios from "axios";
import mytable from "./mytable";
const baseRawData = [
{ name: "name", value: "John Doe" },
{ name: "sex", value: "M" }
];
export default function FuncComp() {
let [rawData, setRawData] = useState(baseRawData);
let [mappedData, setMappedData] = useState([]);
let [apiFilter, setApiFilter] = useState("all");
useEffect(() => {
setMappedData(
rawData.map(e => ({
...e
// Some logic
}))
);
}, [rawData]);
useEffect(() => {
axios.post(`/my/api/${filter}`).then(({ data }) => {
setRawData(data);
});
}, [apiFilter]);
return (
<div>
<h1>The filter is '{apiFilter}'</h1>
<mytable data={mappedData} />
<input
value={apiFilter}
onBlur={e => setApiFilter(e.target.value)}
type="text"
/>
</div>
);
}
How would I, in a class component, achieve the same logic as useEffect to map the newly received raw data every time the user changes the filter and new raw data is received?
This solution is based on the following assumptions;
Code
import React, { Component } from "react";
import axios from "axios";
import mytable from "./mytable";
const baseRawData = [
{ name: "name", value: "John Doe" },
{ name: "sex", value: "M" }
];
export default class ClassComp extends Component{
state = {
rawData: baseRawData,
mappedData: [],
apiFilter: ""
}
componentDidMount() {
axios.post(`/my/api`)
.then(({ data }) => {
this.setState({ mappedData : data });
});
}
filterPost = (e) => {
this.setState({ apiFilter: e.target.value},() => {
axios.post(`/my/api/${this.state.apiFilter}`)
.then(({ data }) => {
this.setState({ mappedData : data });
});
});
}
render() {
const {apiFilter, mappedData, baseRawData } = this.state;
return (
<div>
<h1>The filter is '{apiFilter}'</h1>
<mytable data={ mappedData ? mappedData : baseRawData } />
<input
value={apiFilter}
onBlur={e => this.filterPost(e.target.value)}
type="text"
/>
</div>
);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With