Реагируйте на js с помощью useState Hook

Я пытаюсь использовать хук реакции useState следующим образом:

 const [showMore, setShowMore] = useState(false);
    function handleClick(){
        setShowMore(true);
    }

Я передаю свое значение wishlistItemCount компоненту WishlistItems.

const wishListItemCount = showMore ? itemsCount : 3;
   const contentMessageElement =
        <WishlistItems
            itemCount={wishListItemCount}
            wishlistId={data.id}
            items={items}/>

Я использую следующую кнопку, чтобы изменить состояние

           <Button
                onClick={handleClick}
                className={classes.btnshowmore}>Show More
             </Button>

Но я получаю сообщение об ошибке при загрузке страницы

Storybook preview hooks can only be called inside decorators and story functions.

Пожалуйста помоги

Мой полный компонент

import React,{ useCallback } from 'react';
import { useMutation } from '@apollo/client';

import {FormattedMessage, useIntl} from 'react-intl';
import {ChevronDown, ChevronUp, MoreHorizontal} from 'react-feather';
import {useWishlist} from '@magento/peregrine/lib/talons/WishlistPage/useWishlist';

import {mergeClasses} from '@magento/venia-ui/lib/classify';
import Icon from '../Icon';
import WishlistItems from './wishlistItems';
import defaultClasses from './wishlist.css';
import {Button} from "react-bootstrap";
import {useWishlistAllItems} from "./useWishlistAllItems";
import wishlistItemOperations from "./wishlistItem.gql";
import {useCartContext} from "@magento/peregrine/lib/context/cart";
import {Link} from "../../drivers";
import {useState} from "@storybook/addons";


const Wishlist = props => {
    const {data} = props;
    const {formatMessage} = useIntl();
    const {
        items_count: itemsCount,
        items: items,
        name,
        sharing_code: sharingCode
    } = data;


    const talProps = useWishlistAllItems({
        items,
        ...wishlistItemOperations
    });
    const {
        handleAddAllItemsToCart,
        saveWishList,
        hasError,
        isLoading
    } = talProps;

    const talonProps = useWishlist();
    const {isOpen} = talonProps;
    const [showMore, setShowMore] = useState(false);
    function handleClick(){
        setShowMore(true);
    }

    const wishListItemCount = showMore ? itemsCount : 3;


    const classes = mergeClasses(defaultClasses, props.classes);
    const contentClass = isOpen ? classes.content : classes.content_hidden;
    const visibilityLabel = sharingCode
        ? formatMessage({id: 'wishlist.publicText', defaultMessage: 'Public'})
        : formatMessage({
            id: 'wishlist.privateText',
            defaultMessage: 'Private'
        });


    const contentMessageElement = itemsCount ? (
        <WishlistItems
            itemCount={wishListItemCount}
            wishlistId={data.id}
            items={items}/>
    ) : (
        <p>
            <FormattedMessage
                id={'wishlist.emptyListText'}
                defaultMessage={'There are currently no items in this list'}
            />
        </p>
    );

    return (
        <div className={classes.root}>
            <div className={classes.header}>
                <div className={classes.nameContainer}>
                    <h2 className={classes.name}>{name}</h2>
                </div>
                <div className={classes.subname}>
                    <span className={classes.visibility}>
                        {visibilityLabel}
                    </span>
                    <a className={classes.seeall}>See all</a>
                </div>
            </div>
            <div className={classes.tableheadroot}>
                <p className={classes.th1}>Product Information</p>
                <p className={classes.th2}>Put in the Basket</p>
            </div>
            <div className={contentClass}>{contentMessageElement}</div>
            <div className={classes.showmore}>
                <Button
                    onClick={handleClick}
                    className={classes.btnshowmore}>Show More</Button>
            </div>
            <div className={classes.btnsetbottom}>
                <Link to={'/share-wishlist'}>
                <Button className={classes.btnsharewishlist}>
                    Share your wish list
                </Button>
                </Link>
                <Button
                    className={classes.btnsharewishlist}
                    onClick={handleAddAllItemsToCart}>
                    Put all the goods in basket
                </Button>
                <Button
                    onclick={saveWishList}
                    className={classes.btnsharewishlist}>
                    Save your wish list
                </Button>
            </div>
        </div>
    );
};

export default Wishlist;

person Sahan Thilakarathna    schedule 24.11.2020    source источник
comment
‹Кнопка onClick = {handleClick} ...   -  person Roy.B    schedule 24.11.2020
comment
@ Roy.B не имеет значения   -  person Sahan Thilakarathna    schedule 24.11.2020
comment
Вы используете историю в сборнике рассказов, чтобы показать свой новый компонент? Проблема выглядит как проблема конфигурации сборника рассказов, также у Roy.B есть точка в событии onClick от кнопки, которую вы должны передать ссылку или функцию onClick = {handleClick} или onClick = {() = ›handleClick ()}   -  person Yoandry Collazo    schedule 24.11.2020
comment
проблема не в нажатии кнопки. Я понятия не имею о сборниках рассказов   -  person Sahan Thilakarathna    schedule 24.11.2020
comment
Не могли бы вы поделиться своей историей?   -  person Yoandry Collazo    schedule 24.11.2020
comment
@SahanThilakarathna исправление onClick - это начало, если вам нужна помощь с сборником рассказов, поделитесь своим кодом, касающимся реализации сборника рассказов, которую вы сделали   -  person Roy.B    schedule 24.11.2020
comment
что это за история? Понятия не имею. пожалуйста, объясните   -  person Sahan Thilakarathna    schedule 24.11.2020
comment
в StoryBook вы должны создать историю для каждого компонента, который хотите показать, эти истории - это пространство, в которое вы импортируете свой компонент и настраиваете пример, чтобы показать другим, как его использовать. смотрит этот документ storybook.js.org/docs/react/get-started/introduction   -  person Yoandry Collazo    schedule 24.11.2020
comment
Проблема не в вашем компоненте, в этом случае сообщение «Перехватывает предварительный просмотр сборника рассказов» ... укажите мне конфигурацию сборника рассказов.   -  person Yoandry Collazo    schedule 24.11.2020
comment
@SahanThilakarathna измените этот импорт {useState} из @ storybook / addons; в этот импорт {useAddonState} из @ storybook / addons; для получения дополнительной информации см. storybook.js.org/docs/react/api/ addons-api # useaddonstate   -  person Roy.B    schedule 24.11.2020
comment
Я думаю, что решил проблему. Проблема была с импортом useState. Я использовал import {useState} из response; вместо импорта {useState} из @ storybook / addons;   -  person Sahan Thilakarathna    schedule 24.11.2020
comment
@ Roy.B, можете ли вы сказать мне, как передать wishListItemCount моему дочернему компоненту при нажатии кнопки. Измененное значение не передается дочернему компоненту.   -  person Sahan Thilakarathna    schedule 24.11.2020
comment
@SahanThilakarathna const [showMoreWishList, setShowMoreWishList] = useAddonState (data.id, false); функция handleClick () {setShowMore (истина); setShowMoreWishList (истина); }   -  person Roy.B    schedule 24.11.2020
comment
@ Roy.B извини, я не понял. Я использую хук useState ().   -  person Sahan Thilakarathna    schedule 24.11.2020
comment
@ Roy.B тоже решил эту проблему, спасибо   -  person Sahan Thilakarathna    schedule 24.11.2020


Ответы (3)


попробуйте изменить

import {useState} from "@storybook/addons";

to

import {useState} from "react";
person Ahmed Ahmed    schedule 08.02.2021
comment
У меня была такая проблема, есть ли причина импортировать ее оттуда? - person amdan; 21.02.2021

           <Button
                onClick={handleClick}
                className={classes.btnshowmore}>Show More
             </Button>

в html событиях разные и реагируют.

описание документа

person Mohammad Javad Ghasemy    schedule 24.11.2020
comment
нет никакой разницы я обновил свой вопрос - person Sahan Thilakarathna; 24.11.2020

У вас есть 2 проблемы, кнопка при нажатии вызывает при рендеринге, и вам нужно использовать состояние сборника рассказов для передачи изменений состояния

const [showMoreWishList, setShowMoreWishList] = useAddonState(data.id, false); 
  ...

function handleClick(){ 
  setShowMore(true); 
  setShowMoreWishList(true); 
}
 ...

  <Button 
    onClick={handleClick}
 ...
person Roy.B    schedule 24.11.2020