Я должен использовать useDispatch () для своих кнопок-переключателей, поэтому мне нужно отвести их от реакции на состояние редукции. Я следовал руководству по основам Redux и думаю, что сделал это правильно, но когда я пытаюсь хотя бы использоватьSelector для отображения избыточного состояния кнопки, он ничего не показывает.
Так вот мой код:
// types. js в папке действий
export const TOGGLE = "TOGGLE";
// buttonActions в папке действий
export const toggle = () => {
return {
type: 'TOGGLE'
};
};
// buttonReducer в папке редукторов
const buttonReducer = (state = true, action) => {
switch(action.type) {
case 'TOGGLE':
return !state;
default:
return state;
};
};
export default buttonReducer;
А кнопка Reducer импортируется в combReducers, который go хранить.
Код компонента:
import React, { useState, useEffect } from 'react'
import isloff from './mainpage_imgs/isloff.png'
import islon from './mainpage_imgs/islon.png'
import PropTypes from "prop-types";
import { connect, useDispatch, useSelector } from "react-redux";
import { toggle } from '../../actions/buttonActions'
const Islbutton = props => {
const [open, setOpen] = useState(true);
const [role, setRole] = useState('');
useEffect(() => {
if (props.auth.user)
{
setRole(props.auth.user.role);
}
}, []);
const test = useSelector(state => state.button);
const checkRole = (role) => {
if (role === 'Menager' || role === 'Technolog')
{
return true }
else
{
return false
};
}
const toggleImage = () => {
if(checkRole(role)) {
setOpen(!open)
};
}
const getImageName = () => open ? 'islOnn' : 'islOfff'
const dispatch = useDispatch();
return(
<div>
<img style={islplace} src={open ? islon : isloff }
onClick={()=> dispatch(toggle())} />
</div>
);
}
Islbutton.propTypes = {
button: PropTypes.func.isRequired,
auth: PropTypes.obj.isRequired
};
const mapStateToProps = state => ({
button: state.button,
auth: state.auth
});
export default connect(mapStateToProps, {}), (Islbutton);