throw
бросит исключение, которое ты можешь обработать когда-то там потом, и гарантирует, что все дальнейшее исполнение будет прервано.reject
не бросает исключения и исполнение кода не прервется. Исключение будет выброшено когда-то там потом, когда промис этого захочет.new Promise((resolve, reject) => {
reject("reject msg");
console.log("wtf?????");
})
new
вызывает конструктов класса. Во вторых без new
у тебя будет ошибка. setNewItemData
у тебя получается новый массив items
. Который ты пихаешь в setItem
. При каждом вызове setItem
, выполнится вся твоя функция, а значит и items.map
, и заново отрендерится каждый из MyItem
. Если хочешь что рисовался только MyItem
, то модифицируй его внутренний стейт, а не стейт родителя.const Item = ({ item }) => {
const [item, setItem] = useState(itemProp);
const updateItem = useCallback(() => {
setItem((item) => ({
...item,
count: item.count + 1
}));
}, []);
return (
<div onClick={updateItem}>
{item.title} {item.count}
</div>
);
};
export const copy = (str: string) => {
try {
navigator.clipboard.writeText(str);
} catch (err) {
const textArea = document.createElement("textarea");
textArea.value = str;
textArea.style.setProperty("width", "0");
textArea.style.setProperty("height", "0");
textArea.style.setProperty("position", "absolute");
textArea.style.setProperty("left", "-99999px");
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
document.execCommand("copy");
} catch (err) {
// eslint-disable-next-line no-console
console.error(err);
}
document.body.removeChild(textArea);
}
};