代码之家  ›  专栏  ›  技术社区  ›  tatsu

尽量不迟一次收到回复

  •  0
  • tatsu  · 技术社区  · 7 年前

    所以我有一个输入:

    input field

    一旦更改此输入的值,get就会更新并存储在props中以实现持久性,但这与问题无关。

    如果在数据库中找到输入的值,我将在字段旁边添加一个复选标记。

    import EventTypes from '../EventTypes';
    
    const initialState = {
        response: {},
    };
    
    export default (state = initialState, action) => {
        switch (action.type) {
            case EventTypes.EXISTS_FULFILLED.type:
                console.log(action.payload.body().data());
                return { ...state, response: action.payload.body().data() };
            default:
                return state;
        }
    };
    

    注意,上面的控制台日志正确地打印了真/假值(+发送的值。我从服务器返回了这两个值)。

    const defaultProps = {
        onChange: () => {
        },
        value: { type: '' },
        provider: { type: '' },
    };
    
    class InputsComponent extends Component {
    
        onChange = () => {
            this.props.onChange(this.props.id);
        };
    
        updateFirstInput(event) {
                const { onChange, exists, response } = this.props;
                const payload = {
                    objectType: this.props.placeholder.toLowerCase(),
                    objectName: event.target.value,
                };
                exists(payload);
                this.setState({ firstInput: event.target.value });
                onChange({ value: {
                    ...this.state,
                    firstInput: event.target.value,
                } }, this.props.id);
                setTimeout(() => {
                    this.setState({ exitsStore: response });
                }, 200);
                setTimeout(() => {
                    console.log(this.state.exitsStore);
                }, 1000);
            }
    

    控制台日志在第一次调用“updateFirstInput()”时是空的,然后总是比准确度低一个“onChange”。

    这表示“你好”:

    [input value] [ console log of value for which presence on the server is true/false]
    "h"              ""
    "he"             "h"
    "hel"            "he"
    "hell"           "hel"
    "hello"          "hell"
    

    我试过这个:

    const defaultProps = {
        onChange: () => {
        },
        value: { type: '' },
        provider: { type: '' },
    };
    
    class InputsComponent extends Component {
    
        onChange = () => {
            this.props.onChange(this.props.id);
        };
    
    checkExists(object){
        const { exists, response } = this.props;
        const payload = {
            objectType: this.props.placeholder.toLowerCase(),
            objectName: object,
        };
        exists(payload);
        return response;
    }
    
    updateFirstInput(event) {
        const { onChange } = this.props;
        this.setState({ firstInput: event.target.value });
        onChange({ value: {
            ...this.state,
            firstInput: event.target.value,
        } }, this.props.id);
        const response = await this.checkExists(event);
    
        console.log(response);
        this.setState({ exitsStore: response });
    
        console.log('stored data :');
        console.log(this.state.exitsStore);
    }
    

    但出于某种原因,网上建议我们使用await的人并没有提供语境。以上内容甚至不可编译。(npm启动将失败)

    这可能不是等待,但我如何在一个函数中(理想情况下)获得来自服务器的填充响应,该函数与调用输入更新的函数相同。

    约束:

    据我所知,不能在同一个输入上同时使用onBlur和onChange,因为我已经在使用onChange no onBlur了。

    更新:

    如果我简单地去掉计时器:

    const defaultProps = {
        onChange: () => {
        },
        value: { type: '' },
        provider: { type: '' },
    };
    
    class InputsComponent extends Component {
    
        onChange = () => {
            this.props.onChange(this.props.id);
        };
    
    updateFirstInput(event) {
            const { onChange, exists, response } = this.props;
            const payload = {
                objectType: this.props.placeholder.toLowerCase(),
                objectName: event.target.value,
            };
            exists(payload);
            this.setState({ firstInput: event.target.value });
            onChange({ value: {
                ...this.state,
                firstInput: event.target.value,
            } }, this.props.id);
            this.setState({ exitsStore: response });
            console.log(this.state.exitsStore);
        }
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jake Haller-Roby    7 年前

    setState 是异步的。看起来你在使用超时来回避这个事实,但这是一种非常粗糙和暴力的方式来“解决”问题,实际上并没有解决问题(如你的结果所示)。

    设置状态

    this.setState({
        exitsStore: response
    }, () => {
        console.log(this.state.exitsStore);
    });
    
        2
  •  0
  •   tatsu    7 年前

    在这种情况下: componentWillRecieveProps() .

    componentWillReceiveProps(newProps) {
        const response = newProps.response;
        const old = this.props.response;
        console.log(response);
        const id = this.props.id;
        if (response !== old && response.objectIdentifier === id) {
            if (response.activ) {
                if (response.isthere) {
                    this.setState({ inputIcon: 4 });
                } else {
                    this.setState({ inputIcon: 3 });
                }
            } else {
                this.setState({ inputIcon: 2 });
            }
        }
    }
    onChange = () => {
        this.props.onChange(this.props.id);
    };
    updateInput(event) {
        const { onChange, exists, response } = this.props;
        const inputValue = event.target.value;
        this.setState({ input: inputValue });
        onChange({ value: {
            ...this.state,
            input: inputValue,
        } }, this.props.id);
        if (inputValue === '') {
            this.setState({ inputIcon: 0 });
        } else {
            const placeHolder = this.props.placeholder.toLowerCase();
            const objectIdentifier = this.props.id;
            const payload = {
                objectType: placeHolder,
                objectName: inputValue,
                objectIdentifier,
            };
            exists(payload);
            this.setState({
                existStore: response,
            };
        }
    }
    

    这之所以有效,是因为 默认情况下,接收到一个参数,该参数是更新的道具状态,而这个确实是新的道具状态。您可以像我一样检查是否确实有更新:根据传递的参数检查props中的对象,并且仅在操作不同时执行操作。