惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
博客园 - 【当耐特】
H
Help Net Security
腾讯CDC
大猫的无限游戏
大猫的无限游戏
GbyAI
GbyAI
Last Week in AI
Last Week in AI
Jina AI
Jina AI
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
Y
Y Combinator Blog
C
Check Point Blog
博客园 - 司徒正美
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

Oragekk's Blog

A2UI:当 AI Agent 开始直接生成界面 OpenSpec 技术分享:用规格驱动 AI 编程 ChatGPT&Codex订阅教程 一个 waline 评论系统bug引发的思考 Jenkins 远程触发构建踩坑记 Git SSH 密钥配置 初识Rust vuepress-plugin-meting2 谷歌发布多平台应用开发神器Project IDX!PaLM 2加持 Vue常见优化手段 Vue2响应式原理解析 Dart 中的并发 Flutter 工作原理 如何利用GitHub Action提交URL到搜索引擎 提交URL到搜索引擎(百度、Bing、Google) GitHub Actions 使用介绍 素材设计 前端-Q&A 浏览器的事件循环 你不知道的 CSS 之包含块 CSS 属性计算过程 Vercel deploy忽略指定分支 评论插件 Waline 之邮件通知配置 公开API 终端究极美化iTerm2+Pure 使用Bing API提交网站URL Flutter 基础大集合 关于本站 关于本站 关于我
ReactNative State(状态)
Oragekk · 2019-11-12 · via Oragekk's Blog

接上篇 ReactNative开发环境配置,ES6语法介绍

ReactNative State(状态)

概念

通俗来讲,一个组件,或者一个视图,他们都是 Component,Component 用两个最重要的东西,一个props

一个state

我们使用两种数据来控制一个组件:propsstateprops是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变。(props就像一个类的初始化属性一样,只有在创建时可以赋值,并且组件内部不可修改,也就是readonly)

对于需要改变的数据,我们需要使用state。也可以把state理解为一个状态机,对于那些需要改变的数据可以使用state来更改,比如网络接口拿回来的数据,可以放在state里,当需要改变的时候只需要调用setState即可

使用

一般来说,你需要在 class 中声明一个state对象,然后在需要修改时调用setState方法。

假如我们有一个弹窗,想要控制弹窗是不是显示,需要一个modalVisible属性,当更改它的值时从而使界面 UI 产生相应的变化

// 声明state对象
interface IState {
  modalVisible: boolean;
}

export default class ModalMenu extends React.Component<IProps, IState> {
  constructor(props: IProps) {
    super(props);
    this.state = { modalVisible: false };
  }
}

另一种声明方式,声明在类内部,声明的同时,进行初始化

state = {
  modalVisible: false,
};

使用this.state.modalVisible来控制组件是否显示

render() {
        return (
            <Modal
                animationType="fade"
                transparent={true}
                visible={this.state.modalVisible}
                onRequestClose={() => {
                    this.setModalVisible(false)
                }}
            >

        );
}

更新组件状态使用

this.setState({ modalVisible: true });

注意点

实际开发中,我们一般不会在定时器函数(setInterval、setTimeout 等)中来操作 state。典型的场景是在接收到服务器返回的新数据,或者在用户输入数据之后。你也可以使用一些“状态容器”比如Redux来统一管理数据流。

每次调用setState时,BlinkApp 都会重新执行 render 方法重新渲染。

  • render()中 UI 的变化只有当绑定的 state 中的某个属性变化后,才会变化
  • 一切界面变化都是状态state变化
  • state的修改必须通过setState()方法
    • this.state.likes = 100; // 这样的直接赋值修改无效!
    • setState 是一个 merge 合并操作,只修改指定属性,不影响其他属性
    • setState 是异步操作,修改不会马上生效

我们可以看到setState内部的声明

setState<K extends keyof S>(
            state: ((prevState: Readonly<S>, props: Readonly<P>) => (Pick<S, K> | S | null)) | (Pick<S, K> | S | null),
            callback?: () => void
        ): void;

如果想要同步使用,我们可以使用第二个参数 callback?它是可选的

this.setState({ modalVisible: true }, () => {
  // 这里是同步的
});

参考资料:

官方文档

ES6 延展操作符(...)

typeScriptg 中文文档

ReactNative 入门与进阶

https://docs.nativebase.io