美文网首页RN
react native支持ES7中的修饰器语法@

react native支持ES7中的修饰器语法@

作者: 阿拉斌 | 来源:发表于2019-03-30 15:37 被阅读101次

    在使用AntDesign进行Web端开发的时候,经常需要做的事情就是防止用户做重复点击的操作,为此,我专门写了基于定时器的防抖操作(一个函数在指定时间内只执行一次)

    // 定时器
    let timeout;
    
    @Form.create({
        onValuesChange({ dispatch }, changedValues, allValues) {
            // 表单项变化时请求数据
            // eslint-disable-next-line
            // 表单查询
            // 定时监听,避免出错
            // 判断是否有待发起的请求,有的话,就重置
            if (timeout) {
                clearTimeout(timeout);
                timeout = null;
            }
            // 请求数据
            const fake = () => {
                const params = proSearchConfig(allValues);
                dispatch({
                    type: 'project/listProject',
                    payload: {
                        ...params,
                    },
                });
            };
            // 控制请求时间间隔
            timeout = setTimeout(fake, 500);
        },
    })
    

    像上面的操作,我们就限制了再表单变化的时候,0.5秒内只执行一次。

    上面只是Web端的一个操作,首先我们可以发现,这里使用的是一个@Form的操作,在最开始的时候,我们是这么使用ant的表单的:

    Form.create({ name: 'normal_login' })(NormalLoginForm);
    

    后面发现可以使用到ES7的装饰器,于是就换成了上面的写法了

    那么,这个ES7的装饰器应该怎么配置呢?

    1.安装依赖

    yarn add @babel/plugin-proposal-decorators -dev
    
    1. 配置babel.config.js
    module.exports = {
        presets: ['module:metro-react-native-babel-preset'],
        plugins: [
            ['@babel/plugin-proposal-decorators', { 'legacy': true }],
            ['import', { libraryName: '@ant-design/react-native' }] // 与 Web 平台的区别是不需要设置 style
        ]
    };
    

    这样就完成配置了。我第一个使用的场景就是我的下拉菜单,点击按钮展开菜单,再次点击就收起菜单,为了防止用户重复点击,加上了这么一个操作

        /**
         * 说明:展开或者收起列表
         * @date 2019/3/29
         * @time 13:39
         */
        @Bind()
        @Debounce(300)
        openOrClosePanel = () => {
            // 父级传递的点击事件
            const { bannerAction } = this.props;
            if (bannerAction) {
                bannerAction();
            }
    
            const { isActive } = this.state;
            if (isActive) {
                console.log('收起?', isActive);
            } else {
                console.log('展开?', isActive);
            }
            // 如果我点击的,现在是活跃的,就收起来
            if (isActive) {
                this.closePanel().start(() => this.setState({
                    isActive: false
                }));
            } else {
                this.setState({
                    isActive: true
                }, this.openPanel);
            }
        };
    

    相关文章

      网友评论

        本文标题:react native支持ES7中的修饰器语法@

        本文链接:https://www.haomeiwen.com/subject/zazjbqtx.html