当前位置: 首页 > news >正文

ReactNative从零到完整项目-state使用详解

项目连接: 93Laer/MyDemo

前言: 在安卓中我们可以通过自定义一个属性例如一个Boolean来标识是否刷新数据更新视图,但是在RN中props一经指定在生命周期类是不会再发生变化的,所以我们要达到和安卓一样的效果是不能通过props来做的,RN专门为我们提供了state这个字段

state: 是RN 专门用来标识是否重新渲染,通过属性的值来更新数据,React 内部会监听 state 的变化,一旦发生变化就会主动触发组件的 render() 方法来更新 Dom 结构,另外state是组件私有的,是没有办法通过其他组件传递过来的。

state的使用:

  • 1、构造器外面
export default class StateTest extends Component {

//方式一
        state = {
            num: 0
        }


    // 构造
    constructor(props) {
        super(props);
        // 每1000毫秒对num+1
        setInterval(() => {
            this.setState(previousState => {
                return {num: ++this.state.num};
            });
        }, 1000);
    }

    render() {
        var msg = this.state.num
        return (
            <Text size={32} color= {'red'}>{msg}</Text>
        );
    }
}
复制代码
  • 2、方式二构造器内(建议这样)

    // 构造
    constructor(props) {
        super(props);

//方式二
        this.state = {
            num: 0
        }

        // 每1000毫秒对num+1
        setInterval(() => {
            this.setState(previousState => {
                return {num: ++this.state.num};
            });
        }, 1000);
    }

复制代码
 // 每1000毫秒对num+1
        setInterval(() => {
            //这种方式修改state是无效的,必须调用setState()才能起作用
            //this.state= ++this.state.num;

            //this.setState(previousState => {
            //    return {num: ++this.state.num};
            //});
            //也可以这样写,这样写也就可以直接拿到props,有可能我们的业务需要用到props
            this.setState((prevState, props) =>{
                return {num: ++this.state.num};
            } );
        }, 1000);
复制代码

prevState 是一个对之前状态(previous state)的引用,我们是不能直接修改这个参数的值,要想修改 state 的值,我们应该根据 prevState 和 props 参数来创建一个新的 JavaScript 对象,例如:return {num: ++this.state.num};

既然 我们要创建一个JavaScript对象,上面我们是通过一个函数来创建的,当然我们可以直接传入一个对象,而不是一个函数,例如:

this.setState({num: 18});
复制代码

但是我们一般应该不会这样写,毕竟我们在改变视图的时候肯定会有一些逻辑需要处理

特别提示: 作为一个安卓开发,我们第一反应要改变state,可能是以以下方式来处理的

  // 每1000毫秒对num+1
        setInterval(() => {
            //这种方式修改state是无效的,必须调用setState()才能起作用
            this.state= ++this.state.num;

            //this.setState(previousState => {
            //    return {num: ++this.state.num};
            //});
        }, 1000);
复制代码

说明: setState() 方法会把对组件 state 的改变加入到队列中,并且告诉 React 这个组件及其子组件需要重新渲染,React 并不能保证 setState() 一被调用 state 就能更新。所以,如果在调用 setState() 之后,马上就读取 this.state 的值的话,可能会出现误差,所以setState(updater, callback) 方法的第二个参数 callback 是一个可选参数,暂时未找到使用实例。

相关文章:

  • 150行实现Promise 90%的功能
  • PlaNet图片识别机器,准确表现超过人类
  • 精选15个国外CSS框架
  • python基础—条件语句
  • 【391天】每日项目总结系列128(2018.03.03)
  • 有货移动Web端性能优化探索实践
  • 修复.NET的HttpClient
  • 51nod1683
  • KPN iTV的敏捷转型之旅
  • 设计模式之禅之单例模式!
  • 纠纷判决已出,法官要求Uber归还所有Waymo自动驾驶机密文件
  • 10个最新交互式Web设计实例欣赏
  • VSCode建立.net core项目
  • 事物(物质)的存在形式:结构与运动、维度空间:结构-空间,运动-时间...
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 07.Android之多媒体问题
  • EOS是什么
  • es6(二):字符串的扩展
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java,console输出实时的转向GUI textbox
  • Map集合、散列表、红黑树介绍
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • React 快速上手 - 07 前端路由 react-router
  • Redis的resp协议
  • vue数据传递--我有特殊的实现技巧
  • 分布式事物理论与实践
  • 好的网址,关于.net 4.0 ,vs 2010
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 蓝海存储开关机注意事项总结
  • 面试总结JavaScript篇
  • 首页查询功能的一次实现过程
  • 算法---两个栈实现一个队列
  • 算法系列——算法入门之递归分而治之思想的实现
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信支付JSAPI,实测!终极方案
  • 用Python写一份独特的元宵节祝福
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • #laravel 通过手动安装依赖PHPExcel#
  • #NOIP 2014#Day.2 T3 解方程
  • $.ajax,axios,fetch三种ajax请求的区别
  • %@ page import=%的用法
  • (12)Linux 常见的三种进程状态
  • (3)STL算法之搜索
  • (30)数组元素和与数字和的绝对差
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • .Mobi域名介绍
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net网站发布-允许更新此预编译站点
  • .net与java建立WebService再互相调用