【问题标题】:how can i use default props in react.js or react-native?我如何在 react.js 或 react-native 中使用默认道具?
【发布时间】:2021-05-17 12:23:41
【问题描述】:

例如。我有提要和上传组件。我在 Feed 中也有 ImageFeedList 组件,上传组件

(Feed.js)

import React, {useContext, useState, useEffect} from 'react';
import {StackNavigationProp} from '@react-navigation/stack';
import {RandomUserDataContext} from '~/Context/RandomUserData';
import ImageFeedList from '~/Components/ImageFeedList';

type NavigationProp = StackNavigationProp<FeedsTabParamList, 'Feeds'>;
interface Props {
 navigation: NavigationProp;
 }


   const Feeds = ({navigation}: Props) => {

   const {getMyFeed} = useContext(RandomUserDataContext);

   const [feedList, setFeedList] = useState<Array<IFeed>>([]);

   const [loading, setLoading] = useState<boolean>(false);

  useEffect(() => {
    setFeedList(getMyFeed(24));
  }, []);


  return (

     <ImageFeedList
      feedList={feedList}
      loading={loading}
      onRefresh={() => {
      setLoading(true);
      setTimeout(() => {
      setFeedList(getMyFeed(24));
      setLoading(false);
      }, 2000);
      }}
     onEndReached={() => {
     setFeedList([...feedList, ...getMyFeed(24)]);
      }}
     onPress={() => {
     navigation.navigate('FeedListOnly');
     }}
      />
     );
      };

   export default Feeds;

(上传.js)

 import React, {useContext, useState, useEffect} from 'react';
 import {RandomUserDataContext} from '~/Context/RandomUserData';
 import ImageFeedList from '~/Components/ImageFeedList';

  const Upload = () => {
  const {getMyFeed} = useContext(RandomUserDataContext);
  const [feedList, setFeedList] = useState<Array<IFeed>>([]);
  const [loading, setLoading] = useState<boolean>(false);

  useEffect(() => {
  setFeedList(getMyFeed(24));
  }, []);

     return (

   <ImageFeedList
    feedList={feedList}
    loading={loading}
    onRefresh={() => {
    setLoading(true);
    setTimeout(() => {
    setFeedList(getMyFeed(24));
    setLoading(false);
    }, 2000);
  }}
  onEndReached={() => {
    setFeedList([...feedList, ...getMyFeed(24)]);
  }}
  />
 );
 };

 export default Upload;

(ImageFeedList.js)

import React from 'react';

import {
FlatList,
Image,
Dimensions,
NativeSyntheticEvent,
NativeScrollEvent,
} from 'react-native';

  import styled from 'styled-components/native';

  interface Props {

 id?: number;
 bounces?: boolean;
 scrollEnabled?: boolean;
 feedList: Array<IFeed>;
 loading?: boolean;
 onRefresh?: () => void;
onEndReached?: () => void;
  onScroll?: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
 onPress?: () => void;

}

const ImageFeedList = ({
 id,
 bounces = true,
 scrollEnabled = true,
feedList,
loading,
onRefresh,
onEndReached,
onScroll,
onPress,
}: Props) => {
const width = Dimensions.get('window').width;
const imageWidth = width / 3;

return (

<FlatList
  data={feedList}
  style={{width}}
  keyExtractor={(item, index) => {
    return `image-feed-${id}-${index}`;
  }}
  showsVerticalScrollIndicator={false}
  scrollEnabled={scrollEnabled}
  bounces={bounces}
  numColumns={3}
  onRefresh={onRefresh}
  onEndReached={onEndReached}
  onEndReachedThreshold={0.5}
  refreshing={loading}
  onScroll={onScroll}
  scrollEventThrottle={400}
  renderItem={({item, index}) => (
    <ImageContainer
      style={{
        paddingLeft: index % 3 === 0 ? 0 : 1,
        paddingRight: index % 3 === 2 ? 0 : 1,
      }}
      onPress={onPress}>
      <Image
        source={{uri: item.images[0]}}
        style={{width: imageWidth, height: imageWidth}}
      />
    </ImageContainer>
  )}
/>
    );
    };

   export default ImageFeedList;

我想问的是,在 Feed 组件中我有 OnPress,我可以将 onPress 作为道具传递给 ImageFeedList 组件,但上传组件中没有 onPress 道具。但是即使上传中没有 onPress 也不会发生错误,因为我有一个

interface Props {
onPress?: () => void;
 }

我在 ImageFeedList 组件中定义 onPress Props 的这段代码意味着如果我没有得到 Props onPress 那就没问题

我可以在 typeScript 中使用这个默认道具

但我的问题是,除了 typeScript 之外,我如何在 react 和 react-native 中使用默认道具??

有办法吗??

【问题讨论】:

  • 请将您的问题重新表述为分隔的句子。无法理解您目前在问什么。

标签: javascript reactjs typescript react-native


【解决方案1】:

您已经在 ImageFeedList 中使用默认道具。

const ImageFeedList = ({
     id,
     bounces = true, /* <<< has a default value "true"*/
     scrollEnabled = true, /* <<< has a default value "true"*/
     ...
     onPress /* <<< has no defaut value*/,
    }: Props) => {...}

您可以添加类似的内容作为 onPress 的默认设置

const ImageFeedList = ({
     ...
     onPress = () => console.log(), /* a default prop as an arrow function */
    }: Props) => {...

这是另一个如何将函数作为默认参数传递的示例

function y(prop = function () {console.log("I log default")}){
  prop(); 
};
y(); // will log "I log default"
y(function () {console.log("I am not a default");}); // will log "I am not a default"

更新: 您还可以在使用之前检查是否定义了 onPress。

    <ImageContainer
  ...
  onPress={() => typeof onPress === "function" && onPress()}>

【讨论】:

  • 哦,谢谢你,但我怎样才能使用这段代码来做出反应? onPress?: () => 无效;
  • @jackvolten 你说的只是反应是什么意思? React 是 JavaScript,React 函数是简单的 JS 函数。所以 React 和 JS 的语法是一样的。
  • 我在打字稿中可以使用 interface Props 并且我可以定义 onPress 是不必要的,就像你一样 .... interface Props { onPress?: () => void;但如果我不使用打字稿,我怎么能定义 onPress 是没有必要的??
  • 如果不使用 TypeScript,则不必将 onPress 定义为不必要的参数。只是不要传递它,或者在你的代码中忽略它。这不会导致任何错误。
  • 但是这个怎么样? Feed.js 和 Upload.js 这两个组件都使用 ImageFeedList 组件 .. 但只有 Feed 组件需要 onPress 这就是为什么 Feed 组件将 Onpress 作为道具传递给 ImageFeedList 而 imageFeedLise 使用接口 Props { onPress?: () => void } 但如果我不使用打字稿就没有办法使用不必要的道具吗?
猜你喜欢
  • 2019-03-31
  • 2017-11-09
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2018-10-07
  • 1970-01-01
  • 2018-10-06
相关资源
最近更新 更多