精华内容
下载资源
问答
  • 2019-12-15 12:38:14

    有状态和无状态组件,State和SetState

    1.有状态和无状态组件

    1.函数组件又叫做无状态组件,类组件又叫有状态组件;

    2.状态(state)就是数据;

    3.函数组件没有自己的状态,只负责数据展示;

    4.类组件有自己的状态,负责更新UI让页面动起来;

    2.State和SetState

    2.1 State的基本使用

    1.状态(state)即数据,是组件内部的私有数据,只能在组件内部使用;

    2.state的值是对象,表示一个组件中可以有多个组件;

    3.通过this.state来获取状态;

    calss App extends React.Component{
        constructor() {
            super()
            //第一种初始化方式
            this.state={
                count:0
            }
        }
        //第二种初始化方式
        state ={
            count:1
        }
        render() {
            return(
            	<div>计数器:{this.state.count}</div>
            )
        }
    }
    

    2.2 setState()修改状态

    1.状态是可变的;

    2.语法:this.setState(要修改的数据)

    3.不要直接修改state中的值,这是错误的,需要通过 this.setState() 来进行修改;

    4.setState()作用: 1.修改state,2.更新UI;

    5.思想:数据驱动视图;

    6.React底层会有监听,一旦调用了setState导致了数据的变化,就会重新调用一次render方法,重新渲染当前组件

    class App extends React.Component{
        state={
            count:1
        }
    	render() {
            return(
            	<div>
                	<div>计数器:{this.state.count} </div>
    				<button onClick={()=>{
                        this.setState({
                            count:this.state.count+1
                        })
                    }}> 点我计数<button/>
            )
        }
    }
    
    更多相关内容
  • react-scroll-components 组对页面滚动做出React的组件和mixin ScrollListenerMixin 这个mixin提供了如下状态: scrollTop,代表文档当前的滚动位置isScrolling,用户当前是否正在滚动文档,可以通过以下方法到您...
  • hooks中通过useRef和useEffect获取轮的props和state 看一下官方文档对useRef的描述 useRef 当ref对象内容发生变化时,是不会引发组件重新渲染的; 再看一下useEffect的执行实际 他会在浏览器完成布局与绘制之后,...

    hooks中通过useRef和useEffect获取上一轮的props和state

    看一下官方文档对useRef的描述

    useRef

    在这里插入图片描述
    当ref对象内容发生变化时,是不会引发组件重新渲染的;

    再看一下useEffect的执行实际
    在这里插入图片描述
    他会在浏览器完成布局与绘制之后,在一个延迟时间中被调用.
    结合useRef和useEffect,我们就能够获取到上一次的props和state;

    function PrevState() {
      const [count, setCount] = React.useState(0);
    
      const prevCountRef = React.useRef();
      React.useEffect(() => {
        prevCountRef.current = count;
      });
      const handleClick = () => {
        setCount(count+1)
      }
      return (
        <>
          <button onClick={handleClick}>+1</button>
          <h1>Now: {count}, before: {prevCountRef.current}</h1>
        </>
      )
    }
    

    最初渲染过程:
    count =0;
    渲染页面: //Now: 0,before:
    执行useEffect, prevCountRef.current=0;(因为ref对象内容变化不会引发组件重新渲染,所以prevCountRef.current的值变了, 页面依旧是: //Now: 0,before:)

    当点击按钮 count +1 的时候,
    出发handleClick函数,count +1;
    count 发生变化, 组件重新渲染;
    页面: //Now: 1,before: 0
    触发useEffect,prevCountRef.current= 1
    ** ref对象发生变化,不会重新渲染;**
    页面: //Now: 1,before: 0

    以上;

    展开全文
  • 支持任何组件类型,即无状态/类。 非常小的捆绑尺寸。 通过渲染道具模式使用它(支持子级或渲染道具): import { SizeMe } from 'react-sizeme' function MyApp() { return {({ 尺寸 }) => 我的宽度是 {size.width}...
  • Flutter组件状态管理的三种方法

    千次阅读 2021-11-29 16:34:26
    前言 前面讲了Flutter布局,布局只是静态的。...有状态组件 重点来了,如何使用实现个有状态的组件呢? 有状态的组件一般由两个类构成,个StatefulWidget子类和个State子类. State类包含了组

    前言

    前面讲了Flutter布局,布局只是静态的。在Flutter中,组件分为StatelesslWidget和StatefulWidget。

    • StatelesslWidget
      没有状态,是一成不变的。比如图标,文字,按钮等
    • StatefulWidget
      有状态的组件,页面数据是动态的,或者会随着用户操作变化,比如多选框,文本输入框等。

    有状态组件

    重点来了,如何使用实现一个有状态的组件呢?

    • 有状态的组件一般由两个类构成,一个StatefulWidget子类和一个State子类.
    • State类包含了组件的build()方法,并且负责维护组件状态
    • 当这个组件的状态变化了,可以调用setState()方法来刷新页面

    状态管理

    由谁来负责状态管理呢?是组件本身,还是他的父类,两者都有又或是其他对象?答案是都可以。也就是说有三种方法实现状态管理:

    1. 组件自己管理自己的状态
    2. 组件的父组件管理状态
    3. 混搭管理

    那么如何决定该用那种方式来进行状态管理呢?一般来讲有以下原则:

    1. 如果是用户数据,比如多选框是否被选中,一般是由选择第2种方法
    2. 如果动效,比如放大缩小,那一般用第1种方法

    PS:如果你实在迷芒,就直接选择用第2种方法,用父类管理状态。

    举例

    组件自己管理自己的状态

    如下代码:_TapboxAState 这个State子类为TapboxA维护状态,内部定义了一个_active 变量来决定当前是否为激活的状态,内部还定义了一个 _handleTap() 回调函数,来处理用户点击后的逻辑,并且调用了setState()生命周期方法,重新刷新页面。

    import 'package:flutter/material.dart';
    
    // TapboxA 自己管理状态
    void main() => runApp(const MyApp());
    //------------------------- TapboxA ----------------------------------
    
    class TapboxA extends StatefulWidget {
      const TapboxA({Key? key}) : super(key: key);
      @override
      _TapboxAState createState() => _TapboxAState();
    }
    
    class _TapboxAState extends State<TapboxA> {
      bool _active = false;
    
      void _handleTap() {
        setState(() {
          _active = !_active;
        });
      }
      
      @override
      Widget build(BuildContext context) {
        return GestureDetector(
          onTap: _handleTap,
          child: Container(
            child: Center(
              child: Text(
                _active ? 'Active' : 'Inactive',
                style: const TextStyle(fontSize: 32.0, color: Colors.white),
              ),
            ),
            width: 200.0,
            height: 200.0,
            decoration: BoxDecoration(
              color: _active ? Colors.lightGreen[700] : Colors.grey[600],
            ),
          ),
        );
      }
    }
    
    //------------------------- MyApp ----------------------------------
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Flutter Demo'),
            ),
            body: const Center(
              child: TapboxA(),
            ),
          ),
        );
      }
    }
    

    父组件管理状态

    更多时候我们需要父组件来决定子组件什么时候来更新状态,子组件只需要根据父组件传过来的参数进行合理的展示即可。这种情况下子组件并不需要维护状态,所以子组件是一个StatelessWidget,父组件ParentWidget才是StatefulWidget。代码如下:
    父组件维护了一个_active变量用来标记是否为激活状态,并且实现了回调函数_handleTapboxChanged用来反转激活状态,供子组件调用。子组件TapboxB 是一个无状态组件,只需要在被点击的时候通知父组件来管理状态。

    
    import 'package:flutter/material.dart';
    
    void main() => runApp(const MyApp());
    
    
    class ParentWidget extends StatefulWidget {
      const ParentWidget({Key? key}) : super(key: key);
    
      @override
      _ParentWidgetState createState() => _ParentWidgetState();
    }
    
    class _ParentWidgetState extends State<ParentWidget> {
      bool _active = false;
    
      void _handleTapboxChanged(bool newValue) {
        setState(() {
          _active = newValue;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return SizedBox(
          child: TapboxB(
            active: _active,
            onChanged: _handleTapboxChanged,
          ),
        );
      }
    }
    
    //------------------------- TapboxB ----------------------------------
    
    class TapboxB extends StatelessWidget {
      const TapboxB({
        Key? key,
        this.active = false,
        required this.onChanged,
      }) : super(key: key);
    
      final bool active;
      final ValueChanged<bool> onChanged;
    
      void _handleTap() {
        onChanged(!active);
      }
    
      @override
      Widget build(BuildContext context) {
        return GestureDetector(
          onTap: _handleTap,
          child: Container(
            child: Center(
              child: Text(
                active ? 'Active' : 'Inactive',
                style: const TextStyle(fontSize: 32.0, color: Colors.white),
              ),
            ),
            width: 200.0,
            height: 200.0,
            decoration: BoxDecoration(
              color: active ? Colors.lightGreen[700] : Colors.grey[600],
            ),
          ),
        );
      }
    }
    
    //------------------------- MyApp ----------------------------------
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Flutter Demo'),
            ),
            body: const Center(
    //          child: TapboxA(),
              child: ParentWidget(),
    
            ),
          ),
        );
      }
    }
    

    混搭管理

    混搭管理状态,就是因为有些情况下我们需要父组件管理一部分状态,子组件独立管理另一部分状态。在本次,我们根据上例添加一个动效,按钮按下时要显示高亮状态(前文讲过,动效一类的状态一般要组件本身管理),抬起时取消高亮。
    如下代码:ParentWidget负责维护_active状态来标志是否被激活,子组件TapboxC 负责维护_highlight 状态用来控制是否高亮显示。
    在这里插入图片描述

    
    import 'package:flutter/material.dart';
    
    void main() => runApp(const MyApp());
    
    
    class ParentWidget extends StatefulWidget {
      const ParentWidget({Key? key}) : super(key: key);
    
      @override
      _ParentWidgetState createState() => _ParentWidgetState();
    }
    
    class _ParentWidgetState extends State<ParentWidget> {
      bool _active = false;
    
      void _handleTapboxChanged(bool newValue) {
        setState(() {
          _active = newValue;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return SizedBox(
          child: TapboxC(
            active: _active,
            onChanged: _handleTapboxChanged,
          ),
        );
      }
    }
    
    //----------------------------- TapboxC ------------------------------
    
    class TapboxC extends StatefulWidget {
      const TapboxC({
        Key? key,
        this.active = false,
        required this.onChanged,
      }) : super(key: key);
    
      final bool active;
      final ValueChanged<bool> onChanged;
    
      @override
      _TapboxCState createState() => _TapboxCState();
    }
    
    class _TapboxCState extends State<TapboxC> {
      bool _highlight = false;
    
      void _handleTapDown(TapDownDetails details) {
        setState(() {
          _highlight = true;
        });
      }
    
      void _handleTapUp(TapUpDetails details) {
        setState(() {
          _highlight = false;
        });
      }
    
      void _handleTapCancel() {
        setState(() {
          _highlight = false;
        });
      }
    
      void _handleTap() {
        widget.onChanged(!widget.active);
      }
    
      @override
      Widget build(BuildContext context) {
        return GestureDetector(
          onTapDown: _handleTapDown, // Handle the tap events in the order that
          onTapUp: _handleTapUp, // they occur: down, up, tap, cancel
          onTap: _handleTap,
          onTapCancel: _handleTapCancel,
          child: Container(
            child: Center(
              child: Text(widget.active ? 'Active' : 'Inactive',
                  style: const TextStyle(fontSize: 32.0, color: Colors.white)),
            ),
            width: 200.0,
            height: 200.0,
            decoration: BoxDecoration(
              color: _highlight?Colors.lightGreen :widget.active ? Colors.lightGreen[700] : Colors.grey[600],
            ),
          ),
        );
      }
    }
    //------------------------- MyApp ----------------------------------
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          home: Scaffold(
            appBar: AppBar(
              title: const Text('Flutter Demo'),
            ),
            body: const Center(
    //          child: TapboxA(),
              child: ParentWidget(),
    
            ),
          ),
        );
      }
    }
    

    当然你也可以把高亮显示的状态交给父组件来管理,但是当你开发完这个组件交给同事来用的时候,别人可能只会关注业务逻辑上的处理,不会关注的动效处理。

    其他交互组件

    Flutter内部预置了很多交互组件,甚至还有IOS风格的组件,都可以拿来用。如果有必要的话,可以向上面的例子一样自定义组件使用。

    展开全文
  • 组件分为函数组件和类组件,在hooks 出来之前,只有类组件才有状态,现在不管函数组件和类组件,都是含有状态的。这里只讨论类组件状态 含义以及意义 ** 含义** 组件状态,其实就是组件中的个属性,这个属性...

    组件分为函数组件和类组件,在hooks 出来之前,只有类组件才有状态,现在不管函数组件和类组件,都是含有状态的。这里只讨论类组件的状态

    含义以及意义

    ** 含义**
    组件的状态,其实就是组件中的一个属性,这个属性就是state

    import React, { Component } from 'react'
    // 定义一个状态的接口
    interface IState {
      // 定义一个n,为number 类型
      n: number
    }
    
    export default class TestState extends Component {
      // 这个语法是esnext中的,在react中是可以使用的,可以使用babel来进行转译
      state:IState = {
        n: 100
      }
      render() {
        // 获取状态值
        console.log(this.state.n);
        return (
          <div>
            状态值{this.state.n}
          </div>
        )
      }
    }
    
    

    结果
    在这里插入图片描述

    组件为什么需要状态(state)
    我们都知道,每个组件时一个独立的ui单元,包含行为(js),样式(css),结构(html)。每个组件里面可以传递参数,但是传递的参数是不能修改的(详情查看)。如果在组件内部修改修改参数,那么就需要使用到组件状态state

    • 组件状态(state):组件可以自行维护的数据
    • 组件状态(state)仅在类组件中有效
    • 状态(state),本质上是类组件的一个属性,是一个对象

    状态初始化

    两种初始化的方式:构造函数声明使用esnext语法进行声明

    构造函数声明

    import React, { Component } from 'react'
    // 定义一个状态的接口
    interface IState {
      // 定义一个n,为number 类型
      n: number
    }
    
    export default class TestState extends Component<{}, IState> { // 这里的IState 对状态进行声明
    
      constructor(props:{}){
        super(props);
        // 此处进行赋值
        this.state = {
          n: 100
        }
      }
      render() {
        // 获取状态值
        console.log(this.state.n);
        return (
          <div>
            状态值{this.state.n}
          </div>
        )
      }
    }
    
    

    结果
    在这里插入图片描述

    esnext 语法进行声明

    在上述代码,含义中的举例就是通过esnext 的方式进行声明的.
    查看

    状态变化

    1.不能直接改变状态:因为React无法监控到状态发生了变化
    在这里插入图片描述

    2.必须使用this.setState({})改变状态
    例如:

    import React, { Component } from 'react'
    // 定义一个状态的接口
    interface IState {
      // 定义一个n,为number 类型
      n: number
    }
    
    export default class TestState extends Component<{}, IState> {
    
      constructor(props:{}){
        super(props);
        this.state = {
          n: 100
        }
    // 这里使用计时器,来改变里面的值
        setInterval(() => {
          this.setState({
            n: this.state.n - 1
          })
        },1000)
      }
      render() {
        return (
          <div>
            状态值{this.state.n}
          </div>
        )
      }
    }
    
    

    结果
    在这里插入图片描述

    3.一旦调用了this.setState,会导致当前组件重新渲染,当前组件里面的其他组件也会重新着渲染。

    • 上面的计时器中,每次改变,页面上的渲染结果也是跟着改变的可以说明问题
    • 如果在render里面写了this.setState({}),会导致内存溢出也可以说明问题:
      在这里插入图片描述

    state 注意事项

    stateprops的区别

    • props:该数据是由组件的使用者传递的数据,所有权不属于组件自身,因此组件无法改变该数组
    • state:该数组是由组件自身创建的,所有权属于组件自身,因此组件有权改变该数据

    setState,它对状态的改变,可能是异步

    在这里插入图片描述
    代码修改如下:
    在这里插入图片描述

    当我点击按钮的时候,页面的数据是会发生改变的,这个和我们的html 是一样的,页面的js事件来改变页面渲染的值。但是结果却是如下:(页面上的值改变了,但是当前方法里面的值却是没有改变的)
    在这里插入图片描述
    结论: 如果改变状态的代码处于某个HTML元素的事件中,则其是异步的,否则是同步

    获取state修改后的数据

    通过setState的第二个参数

    在这里插入图片描述

    通过setState的第二个参数获取修改后的值

    change方法进行修改:
    在这里插入图片描述
    结果
    在这里插入图片描述

    思路拓展

    如果我想要连续的修改state的某个值,那么代码将会是这样的:
    在这里插入图片描述
    代码的执行的结果是没有问题的
    在这里插入图片描述

    解决办法

    我们通过上面的setState的声明中可以看到,第一个参数是可以使用一个函数的,如果遇到某个事件中,需要同步调用多次,需要使用函数的方式得到最新状态

    修改change方法:
    在这里插入图片描述

    结果
    在这里插入图片描述

    分析:为啥render只是执行一次?
    个人理解:在同一个事件或者函数中,React会对异步的setState进行优化将多次setState进行合并(将多次状态改变完成后,再统一对state进行改变,然后触发render)

    state的最佳实践

    1. 把所有的setState当作是异步的
    2. 永远不要信任setState调用之后的状态
    3. 如果要使用改变之后的状态,需要使用回调函数(setState的第二个参数)
    4. 如果新的状态要根据之前的状态进行运算,使用函数的方式改变状态(setState的第一个函数)
    展开全文
  • 底部tabBar在切换时都会有对应被选中或未被选中的状态,我是在页面定义判断active与index的值是否相等,相等则显示被选中状态,反之显示未被选中状态。 原因分析: 提示:这里填写问题的分析: 例如:Handler ...
  • 最近在做项目中,遇到了个问题,就是两个组件绑定vuex中相同的状态值,但是组件改变的时候,另组件中的值同步改变了,但是页面没有更新,只有数组有这个问题。后来思路就是深度监听到数组改变后,再更新下...
  • rn 函数式组件获取组件的实例

    千次阅读 2020-06-01 21:21:25
    class式组件获取组件的实例只要用ref就可以了,但是函数式组件就要复杂一点 函数式组件要给子组件直接绑定ref是不成功的,要求子组件使用forward创建才可以,如下 const ChildRefScreen = () => { const _a ...
  • 获取当前状态 超时时间 获取索引节点 使用流畅的链接查询 样品测试 社区项目 您需要的工具 告诉我你的问题 贡献 安装和配置 添加为依赖项: npm i --save cypress-react-selector 包括命令 通过添加以下内容,...
  • 首先,v-model的值为当前被选中的el-option的 value 属性值 需求:进入编辑页面状态栏默认选中生效,如下显示: html部分代码: 状态> 请选择> label=item.label value=item.value> </el>
  • 问题 : 在vue项目中,刷新页面之后,之前的登录信息, 打开的所有菜单,都消失, 如何实现刷新之后页面仍然是刷新之前的状态 解决 : 使用vuex状态管理, 搭配 , webstorage本地存储. 将vuex里面的数据同步更新到 ...
  • vue获取当前激活路由

    千次阅读 2018-01-20 19:33:32
    个 route object(路由信息对象) 表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的 route records(路由记录)。 route object 是 immutable(不可变) 的,每次成功的导航后...
  • 如何在React中动态显示时间日期

    千次阅读 2020-12-19 14:40:46
    您需要使用该状态来保持当前周结束并开始。只要道具或状态发生变化,组件都会重新渲染。你需要保持这个数据的状态(如果使用redux,你会从道具中获取数据)。下面是个使用ES6个例子(请确保您的WebPack配置包括...
  • 也许你已经知道了组件化,但项目迭代任务紧张,根本没有时间进行整体解耦,更害怕下子改动太大导致的风险不可控,不敢大改,怎么办? 先别急着放弃,渐组件化了解一下 背景故事 在实行组件化改造之前,...
  • 上次的项目中,我是通过用static静态量来保存当前播放的歌曲状态的,这样子虽然可以实现功能,但是从设计上来说并不是很好,容易导致APP崩溃和手机发烫~(我不确定是不是static的锅,但是面向对象编程就得少用static
  • Vue组件实现触底判断

    千次阅读 2021-01-30 13:40:49
    本文实例为大家分享了Vue组件实现触底判断的具体代码,供大家参考,具体内容如下非常简陋的代码,以后有空回来完善子组件代码:export default {name:'Scroll',methods:{scrollEvent(){if (document.documentElement...
  • vue关闭当前页面 跳转_vue常见面试题

    千次阅读 2020-11-19 23:08:33
    1.vue优点? 答:轻量级框架:只关注视图层,是个构建数据的视图集合,大小只有几十kb; 简单易学:国人开发,中文文档,不存在... 组件化:保留了react的优点,实现了html的封装和重用,在构建单页面应用方面有...
  • Layui数据表格中用到了表单元素radio,在当前页面选中radio状态,并同步更新到保存表格中所有的数据的数组中(获取表格中的所有数据并保存到数组中),再点击分页组件中的下一页、上页、跳转按钮进行切换另外个...
  • 说到在项目中引入个视频,我们肯定会想到 HTML5 为我们提供的 Video 标签,它为我们提供了许多属性和方法,使用起来很方便,当然直接使用也会遇到各种兼容问题,在最初学习 Video 标签时,W3C 官网就给出了这样的...
  • 这里有两个问题我做起来比较费劲,花了大半个下午的时间才找到解决问题的方法,个就是点击展开图标的方法是哪个(expandable属性下的onExpand()),另个就是找到点击展开图标调后台数据之后,如何让表格刷新...
  • 很多人在用uni-rate组件时都有类似的反馈,官网上也是挺多反馈的,接下来我来提供几种星星值动态赋值,选中星星值动态...这样会防止从子组件意外变更父级组件状态,从而导致你的应用的数据流向难以理解。那么我...
  • 从StatefulWidget中获取State
  • 以下面方法为例 **在页面中使用ref绑定 **而后在methods中放在个事件中去触发他打印看一下结果 当前勾选个。点击确定查看输出 输出结果》》》 ok 结束 ...
  • 「Vue系列」之Vue2实现当前组件重新加载

    万次阅读 多人点赞 2019-04-03 10:40:49
    需要把当前组件完全还原成初始化状态,不要页面全部刷新 例如:重置按钮,只刷新当前加载组件 其他办法: 使用vue-router重新定向到当前页面页面不刷新 使用window-reload() 页面全部刷新,用户体验太差 解决...
  • jmeter组件介绍

    千次阅读 2022-03-16 10:26:06
    . 性能测试 1.0 为什么要进行性能测试? 评估当前系统的能力 寻找性能瓶颈,优化系统性能 评估软件是否满足未来的需要 招聘需要 1.1 什么是性能 时间:系统处理用户请求的响应时间资源:系统运行过程中,...
  • Jquery 获取组件的值

    千次阅读 2013-07-16 23:21:00
    jQuery获取 Select选择的Text和Value: 语法解释: 1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中项 时触发 2. var checkText=$("#select_id").find("option:...
  • src index.js /* * 项目入口文件 - 整个项目的灵魂 */ import React from 'react' // React的顶级库,它...import ReactDOM from 'react-dom' // 它的所用就是将React组件编译为DOM结构,然后插入到浏览器网页中 ...
  • 切换保持组件当前状态 <component :is='变量'></component> 切换组件: (1)变量的值即为组件名,使用时需在data属性中声明,且不加/ (2)变量的值为哪个组件名即代表哪个组件 保持当前组件状态...
  • 这里主要针对一些控件和布局的使用,篇幅会有点长。而且,不会像第章一样全部详细列出。本章主要会用知识点的方式展示内容。 ①Android应用开发的—...、界面编程与视图 (View) 组件 1.视图组件与容器组件 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 131,625
精华内容 52,650
关键字:

无状态组件一进页面获取当前时间

友情链接: Banco.rar