Server:
io.on('connection', (socket) => {
const username = socket.id;
socket.emit('connection', username);
socket.emit(
'products',
JSON.parse(fs.readFileSync(`${path.join(__dirname)}/db.json`, 'utf-8'))
);
socket.on('update', (data) => {
console.log(data);
const { id, value, replace } = data;
const products = JSON.parse(
fs.readFileSync(`${path.join(__dirname)}/db.json`, 'utf-8')
);
products.map((item) => {
if (item.id === id) {
item[replace] = value;
}
return item;
});
fs.writeFileSync(
`${path.join(__dirname)}/db.json`,
JSON.stringify(products)
);
socket.emit('products', products);
});
});
MyComponent:
import React, { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import socketClient from 'socket.io-client';
import Table from '../components/TableProducts';
import { updateDataTable, getData } from '../redux/actions/products';
import { getProducts } from '../redux/selectors/products';
const TableContainer = () => {
const dispatch = useDispatch();
const products = useSelector((state) => getProducts(state.products));
const socket = socketClient.connect('http://localhost:9000/');
useEffect(() => {
socket.on('products', (data) => {
dispatch(getData(data));
});
}, []);
const handleChange = (object) => {
// const {id, name, value} = data;
dispatch(updateProduct(object));
socket.emit('update', object);
}
return (
<Table data={products} />
);
};
export default TableContainer;
After executing handleChange, my socket is sent to the server and everything is processed well there. The problem is that apparently my component is updated when receiving a socket from the server, thereby executing useEffect creating a new connection.
UPDATE (Add my index.js file):
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import 'bootstrap/dist/css/bootstrap.min.css';
import './scss/_base.scss';
import store from './redux/store';
import App from './App';
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);