0

请有人告诉我什么是诸如返回一堆函数并在其中使用反应钩子的反应组件?

即使是反应功能组件也应该返回 jsx 或任何其他模板,不是吗?反应文档中是否有诸如组件说明?怎么称呼?!

export default function useViewFilter() {
  const dispatch = useDispatch();
  const { boardId, viewId } = useParams<RouteParamsTypes>();
  const [selectedFacets, setSelectedFacets] = useState<SelectedFacets>({});
  const [propertiesData, setPropertiesData] = useState<PropertyData[]>([]);
  const [propertiesFacetingTypes, setPropertiesFacetingTypes] = useState<PropertiesFacetingTypes>({});
  const neededData = useSelector((state: IFrontAppState) => selectFilterHookNeededData(state, { boardId, viewId }));
  const isReady = useSelector((state: IFrontAppState) => isViewModelLoaded(state, boardId, viewId));
  const storeFacetsFilters = useSelector((state: IFrontAppState) => getViewFacetsFilters(state, boardId, viewId));
  const storeFacetingTypes = useSelector((state: IFrontAppState) =>
    getViewPropertiesFacetingTypes(state, boardId, viewId)
  );
  const dataRef = useRef({
    initialized: false
  });

  useEffect(() => {
    handleMakeNewSearch(selectedFacets, false);
  }, [neededData]);

  // last state before refresh
  useEffect(() => {
    if (isReady && !dataRef.current.initialized) {
      dataRef.current.initialized = true;
      setSelectedFacets(storeFacetsFilters ? (storeFacetsFilters as SelectedFacets) : {});
      setPropertiesFacetingTypes(storeFacetingTypes ? storeFacetingTypes : {});
      handleMakeNewSearch(storeFacetsFilters as SelectedFacets, false);
    }
  }, [isReady, storeFacetsFilters, storeFacetingTypes, dataRef]);

  const handleClear = () => {
    const selectedFacets = {};
    setSelectedFacets(selectedFacets);
    handleMakeNewSearch(selectedFacets, true);
    dispatch(
      actions.ClearViewFilters({
        BoardId: boardId,
        ViewId: viewId
      })
    );
  };

  const handleMakeNewSearch = (selectedFacets: SelectedFacets, doUpdateInBackend: boolean) => {
    const { propertiesIds, properties, orderedEntities, boardMembersObj } = neededData;
    if (properties && propertiesIds?.length) {
      const orderedProperties = propertiesIds?.map(pId => ({
        Id: pId,
        ...properties[pId]
      }));
      const itemsJsData = makeItemsJsDataFromAllEntities(orderedEntities, orderedProperties, boardMembersObj);
      const newSearchResult = makeSearchAggregations(itemsJsData, orderedProperties, selectedFacets);
      // set filtred items
      if (doUpdateInBackend) {
        const filtredEntitiesIds = newSearchResult.items.map(x => x.id) as string[];
        dispatch(
          actions.UpdateViewFilters({
            BoardId: boardId,
            ViewId: viewId,
            FacetsFilters: selectedFacets,
            FiltredEntitiesIds: doesThereIsFeltering(selectedFacets) ? filtredEntitiesIds : null,
            PropertiesFacetingTypes: propertiesFacetingTypes
          })
        );
      }
      // update filter panel
      const newPropertiesData = makeNewPropertiesData(
        propertiesIds,
        properties,
        newSearchResult.aggregations,
        propertiesFacetingTypes
      );
      setPropertiesData(newPropertiesData);
    }
  };

  return {
    propertiesData,
    propertiesFacetingTypes,
    handleClear,
    setPropertiesFacetingTypes
  };
}
4

1 回答 1

0

这是一个自定义钩子

这是在 React 函数组件中提取逻辑的一种方式(现在可能是标准方式)。

于 2021-08-24T12:12:08.463 回答