标签: react-functional-component

在 React 函数式组件中每 X 秒调用一次 API

我有以下反应类组件每 10 秒调用一次 API。它的作品没有问题。

class Alerts extends Component {
  constructor() {
    this.state = {
      alerts: {},
    }
  }

  componentDidMount() {
    this.getAlerts()
    this.timerId = setInterval(() => this.getAlerts(), 10000)
  }

  componentWillUnmount() {
    clearInterval(this.timerId)
  }

  getAlerts() {
    fetch(this.getEndpoint('api/alerts/all"))
        .then(result => result.json())
        .then(result => this.setState({ alerts: result }))
  }

  render() {
    return (
      <>
        <ListAlerts alerts={this.state.alerts} />
      </>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其转换为反应功能组件。这是我迄今为止的尝试。

const Alerts = () => {

    const [alerts, setAlerts] = useState([])

    useEffect(() => {
        getAlerts()
        setInterval(() => getAlerts(), 10000)
    }, [])

    getAlerts() …
Run Code Online (Sandbox Code Playgroud)

reactjs react-native react-component react-context react-functional-component

5
推荐指数
2
解决办法
6393
查看次数

如何更改功能组件中的上下文值?

我有一个StatusContext这样命名的上下文:

export const statusCtxInit = {
    open: false,
    toggleOpen() {
        this.open = !this.open;
    }
};

const StatusContext = React.createContext(statusCtxInit);
export default StatusContext
Run Code Online (Sandbox Code Playgroud)

整个应用程序都与提供者一起包装:

// ...
<StatusContext.Provider value={statusCtxInit}>
// ...
Run Code Online (Sandbox Code Playgroud)

useContext为了使用我在 FC 中使用的上下文的值,当我获得该值时它就会起作用。

function MyComp() {
    const status = useContext(StatusContext);
    return (
        <div>
            {status.open
                ? `It's Open`
                : `It's Closed`}

            <button onClick={() => status.toggleOpen()}>
                Toggle
            </button>
        </div>
    )
}

export default MyComp
Run Code Online (Sandbox Code Playgroud)

另一方面,我也想通过调用来更改上下文toggleOpen,但是它不能按我想要的方式工作。实际上该值发生变化但不影响MyComp.

我做错了什么?我该怎么办?

reactjs react-context react-functional-component

5
推荐指数
1
解决办法
3927
查看次数

在变量中存储常量值与在状态中存储有区别吗?

我注意到有几种方法可以在 React 功能组件中实现看似相同的事情。当您拥有仅在此组件内部需要的本质上的配置值(只是一个常量值,从未传入或修改)时,您可以只使用常规值,也const可以将其存储在组件的状态中。

标准变量:

function Example1() {
  const a = 1
  return <div>{ a }</div>
}
Run Code Online (Sandbox Code Playgroud)

存储状态:

function Example2() {
  const [a] = useState(1)
  return <div>{ a }</div>
}
Run Code Online (Sandbox Code Playgroud)

我的印象是,在幕后,这会导致 Example1 在每次渲染时创建一个变量然后处理它,而 Example2 将创建一次变量并保持它直到卸载组件。那是准确的吗?就性能/良好实践而言,这些方法中的一种是否更可取?

javascript reactjs react-hooks react-functional-component

5
推荐指数
2
解决办法
1693
查看次数

使用 useParams() 钩子获取多个 URL 参数

我正在尝试使用 React-Router 5.1 和函数组件中的 useParams 钩子在 url 中传递多个参数。

但是我遇到了非常奇怪的行为。

我将网址粘贴到客户端。

网址:

 http://localhost:3000/onboarding/eventId=5e9a173f9166f800128c04d1&groupId=5e9a173f9166f800128c04dc&userId=5e9a173f9166f800128c04da 
Run Code Online (Sandbox Code Playgroud)

小路:

<Route path = '/onboarding/:eventId?/:groupId?/:userId?' exact component = {OnboardingViewController} />
Run Code Online (Sandbox Code Playgroud)

奇怪的事情#1:我必须将参数设为可选,否则浏览器会永远挂起。

我使用所有这些策略将它们找出来:

    var   {  eventId, groupId, userId } = useParams();
    var   {  eventId } = useParams();
    var   {  groupId } = useParams();
    var   {  userId  } = useParams();

Run Code Online (Sandbox Code Playgroud)

奇怪的事情#2:不幸的是,当尝试使用这些参数时,会发生这种情况:

{userId: undefined, eventId: "eventId=5e9a173f9166f800128c04d1&groupId=5e9a173f9166f800128c04dc&userId=5e9a173f9166f800128c04da", groupId: undefined}
Run Code Online (Sandbox Code Playgroud)

钩子只接受第一个参数并首先将其余部分解释为 te 的一部分。

奇怪的事情 #3:由于添加这个 url params 查询访问页面加载非常慢,需要几秒钟。

我没有看到什么,做错了什么?

回答:

我做错了什么:我使用的是 url/eventId=123。这是错误的。您只需要在 URL url/1/2/3 中的正确位置提供资源。

正确的:

http://localhost:3000/onboarding/5e9aaf4fc27583001190834e/5e9aaf60c275830011908361/5e9aaf4fc275830011908357
Run Code Online (Sandbox Code Playgroud)

然后告诉路由器这些东西将被称为 eventId & groupId & userId。 …

url-parameters reactjs react-router react-hooks react-functional-component

5
推荐指数
2
解决办法
1万
查看次数

在 React.js 中的功能组件中首次渲染之前调用 api

如果我想在第一次渲染组件后调用 API,我知道我们有useEffect钩子来调用 API 方法。(我只讨论功能组件。没有类组件)。

有什么办法,我可以在我的组件第一次渲染之前调用 API。

这个问题的原因是,如果某些 UI 部分依赖于 API,我不想在第一次渲染时向用户显示任何不完整的信息,一旦我从 API 获取数据,这些信息就会改变。这似乎是一个糟糕的 UI 体验。

编辑:我得到了一些使用 useLayoutEffect 或任何消耗性标志来检查它是否渲染的建议。我已经检查过 useLayoutEffect 不起作用,并且通过使用 consumable 标志,我们只是增加了复杂性。

对此我们有没有更好的办法呢?

javascript reactjs react-lifecycle react-hooks react-functional-component

5
推荐指数
1
解决办法
1万
查看次数

检查 React Native 中屏幕是否变得模糊或聚焦?

我正在用这个

useEffect(() => {
        const navFocusListener = navigation.addListener('didFocus', () => {
        console.log('focus');
    });

    return () => {
        navFocusListener.remove();
    };
  }, []);
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码也尝试了其他侦听器。但没有任何好处,我正在使用react-native-immediate-call包进行ussd拨号,但因为它没有任何回调。因此,我将此函数称为打开的拨号器,用于拨打 USSD 代码。所以现在我希望当 ussd 拨号完成后返回屏幕,并且 api 将调用以获得响应。那么我如何检测 USSD 拨号正在运行或已完成,以便我可以向 api 发出请求。

event-listener ussd react-native react-functional-component

5
推荐指数
1
解决办法
9590
查看次数

如何在 React 的子功能组件中触发一个动作?

使用基本的表单/输入布局,很明显应该使用回调来处理从子组件到父组件的状态更改(由子组件启动),但是父组件如何要求子组件重新评估其状态并传达该信息回到父级?

\n

这里的最终目标只是在提交表单按钮时触发子输入的验证。

\n

给定的 [ts] 代码如下所示:

\n
    const Login : React.FC<Props> = (props) => {\n        ...useStates omitted\n\n        const onSubmit = () : void => {\n          //trigger `verify()` in PasswordInput to get up-to-date `valid` state var\n\n \n        }\n        \n        return (\n            <PasswordInput\n              onValidChange={setValid} />\n            <Button\n              onPress={submit} />\n        )\n    }\n\n\n    const PasswordInput : React.FC<Props> = (props) => {\n        ...useStates omitted\n\n        const verify = () => {\n          //verify the password value from state\n\n          props.onValidChange(true)\n        }\n\n\n        return (<Input onBlur={verify}/>) \n    }\n
Run Code Online (Sandbox Code Playgroud)\n

迄今为止采取的注释/路径: …

typescript reactjs react-native react-state react-functional-component

5
推荐指数
1
解决办法
2938
查看次数

如何在完全基于功能组件的 React 应用程序中获取元素的大小?

我有一个完全用功能组件构建的 React 应用程序。我想在屏幕上呈现元素后获取元素的高度,以相应地更改其父元素的大小。

有基于类的应用程序的解决方案,但我找不到任何用于功能组件的解决方案。

我从答案中尝试了这个解决方案,但它没有运行 useEffect 钩子

这是从我的组件中提取的代码

import React, {useRef, useEffect} from 'react';
import {
    MenuContainer,
    GrayBox,
    Wrapper

} from '../LayersMenu/LayerMenu.styles';


export const Component = ({ category, showStatistics }) => {
    const grayBoxRef= useRef(null);
    const wrapperRef= useRef(null);
    const testRef= useRef(null);
    useEffect(()=>{
        const height = wrapperRef.current.offsetHeight;
        console.log(height,'check');
      }, [wrapperRef])
    useEffect(()=>{
        const height = testRef.current.offsetHeight;
        console.log(height,'check2');
    },[testRef]);
    return (
        <MenuContainer ref={testRef}>
            <GrayBox ref={grayBoxRef}>
                <Wrapper ref={wrapperRef} hasAnyAllowedStats={showStatistics}>
                </Wrapper>
            </GrayBox>
        </MenuContainer>
    );
};
Run Code Online (Sandbox Code Playgroud)

PS:接受的答案对我的答案不起作用,但它适用于他在答案中添加的项目,所以我猜我的项目结构有问题或不完全确定。

非常感谢回答

javascript reactjs styled-components react-functional-component

4
推荐指数
1
解决办法
5690
查看次数

如何使用反应路由通过 ID 返回页面?

我是 React 的新手,当我单击View按钮时,我很难弄清楚如何返回一个新页面(一个组件)。我有一个用户表,每行都有一个查看按钮。我只能在完全相同的页面中检索数据,但我想在另一个页面中检索我的视图详细信息,其 url 上的 id,例如:http://user-details-1。有人可以帮我弄这个吗。谢谢!

这是我的视图代码/组件:

import React, { useState, useEffect } from "react";
import Form from "react-bootstrap/Form";

const ViewUserDetaiils = (props) => {
  const [user, setUser] = useState(props.currentUser);

  useEffect(() => {
    setUser(props.currentUser);
  }, [props]);

  return (
    <Form>
      <div>
        <div>
          <strong>Id:</strong> {user.id}{" "}
        </div>
        <div>
          <strong>Name:</strong> {user.name}{" "}
        </div>
        <div>
          <strong>Contact:</strong> {user.contact}{" "}
        </div>
        <div>
          <strong>Email:</strong> {user.email}{" "}
        </div>
      </div>
    </Form>
  );
};

export default ViewUserDetails;
Run Code Online (Sandbox Code Playgroud)

这是我的路由:

import React, { Component } from "react";
import …
Run Code Online (Sandbox Code Playgroud)

reactjs react-routing react-router-dom react-functional-component

4
推荐指数
1
解决办法
4717
查看次数

在 React 中更新对象状态的特定字段

我正在使用 React 功能组件,我只想更新状态的特定字段并像以前一样保留其他值。这是状态初始化 -

const[value, setValue] = React.useState({
     a: "5",
     b: "6"
});
Run Code Online (Sandbox Code Playgroud)

我只想将“a”的值更新为其他值,比如说 7(同时保留“b”的相同值)。目前我正在这样做 -

setValue(currValue => ({
   ...currValue,
   a: "7"
}))
Run Code Online (Sandbox Code Playgroud)

这是错误的吗?如果是,正确的做法是什么?

object reactjs react-hooks react-state react-functional-component

4
推荐指数
1
解决办法
1万
查看次数