Р
Size: a a a
Р
MK
SL
MK
SL
MK
SL
MK
MK
SL
SL
I
А
MK
NN
MM
TK
KI
import * as React from 'react';
import { useEffect, useState } from 'react';
function isMinValue(value, min) {
return min !== undefined && value <= min;
}
function isMaxValue(value, max) {
return max !== undefined && value >= max;
}
export default function Counter(props) {
const [localValue, setLocalValue] = useState(String(props.value));
useEffect(() => {
setLocalValue(String(props.value));
}, [props.value]);
function onChange(event) {
setLocalValue(event.target.value);
}
function onBlur(event) {
const value = isMaxValue(Number(event.target.value), props.max)
? props.max
: isMinValue(Number(event.target.value), props.min)
? props.min
: event.target.value;
const intValue = Math.floor(Number(value));
props.handleChange(intValue);
}
return (
<input
data-testid="input"
style={{ width: 48 }}
type="number"
onChange={onChange}
onBlur={onBlur}
value={localValue}
max={props.max}
min={props.min}
/>
);
}
Пишу тесты на данный компонент, и столкнулся с проблемой: при проверке кейса на попытку ввода числа больше max, инпут сохраняет старое значение после ререндера it('result value is rounded', () => {
let value = 0;
const handleChange = jest.fn(x => {
value = x;
});
const { rerender } = render(
<Counter {...defaultProps} value={value} handleChange={handleChange} />
);
const input = screen.queryByTestId('input');
fireEvent.change(input, { target: { value: 1.9 } });
fireEvent.blur(input);
expect(value).toBe(1); // ✅ Проп успешно изменился
rerender(<Counter {...defaultProps} value={value} handleChange={handleChange} />);
expect(input.value).toBe('1'); // ✅ Локальное значение успешно изменилось
});
А вот тест на максимальное значение не проходит. Точнее тут даже так: проп изменяется правильно, а локально значение остается неправильным - как будто компонент просто не заререндерился it('no updates on change if new value is bigger than max', () => {
let value = 10;
const max = 10;
const handleChange = jest.fn(x => {
value = x;
});
const { rerender } = render(
<Counter {...defaultProps} value={value} max={max} handleChange={handleChange} />
);
const input = screen.queryByTestId('input');
fireEvent.change(input, { target: { value: 20 } });
fireEvent.blur(input);
expect(value).toBe(10); // ✅ Проп успешно изменился
rerender(<Counter {...defaultProps} value={value} handleChange={handleChange} />);
expect(input.value).toBe('10'); // ❌ Received: '20'
});
Казалось бы два похожих кейса: введённое значение парсится в компоненте по блюру, да и проп успешно меняется. Но в первом случае, localValue изменилось, а во втором нет. И мне кажется я упускаю какой-то фундаменатльный момент. При этом в самом UI все ок - в инпуте в итоге правильное значениеАК
[paginateData, setPaginateData] = useState([]);
{paginateData.per_page}
</div>useEffect(() => {
api.get(
URL, { headers: authHeader() })
.then(res => {
consoleconsole.log(res);
setPaginateData(res.data.pagination);
})
.catch(err => {
consoleconsole.log(err);
})
}, []);
PD