React-ace: مشكلة مع ace داخل مكون الحقل لـ Redux-Form

تم إنشاؤها على ١٨ ديسمبر ٢٠١٧  ·  6تعليقات  ·  مصدر: securingsincity/react-ace

لدي مشكلة مشابهة لـ https://github.com/securingsincity/react-ace/issues/120 الآن.

أنا أستخدم رد الفعل داخل نموذج إعادة الإرسال ، كمكوِّن تم تمريره إلى الحقل.
في أي وقت يفقد محرر الكود التركيز ، يتم تعيين القيمة على "" ويتم عرض نقطتين داخل محرر ace.

الكود الخاص بي مشابه تمامًا لـ jschlieber في الإصدار الأصلي المقترح ، ألق نظرة:

import React from 'react'
import AceEditor from 'react-ace'
import _ from 'lodash';

import 'brace/mode/javascript';
import 'brace/theme/monokai';

export default function ReduxAce (props) {
    console.log(props.input.onBlur, props);

    const {
        input,
        theme = 'monokai',
        mode = 'javascript',
        fontSize = 14,
        tabSize = 2,
        width = '1000px',
        height = '500px',
        ...custom
    } = props;

    return (
        <AceEditor
            theme={theme}
            mode={mode}
            fontSize={fontSize}
            tabSize={tabSize}
            width={width}
            height={height}
            onBlur={() => props.input.onBlur(props.input.value)}
            editorProps={{$blockScrolling: Infinity}}
            {...input}
            {...custom}
        />
    )
}

و

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { saveDraft } from '../actions/index';
import { bindActionCreators } from 'redux';
import { Field, reduxForm } from 'redux-form';
import ReduxAce from '../components/redux_ace'

const ID = 'id123', NAME = 'name123', SOME_CODE = 'code123';

function mapStateToProps({draft}) {
    return {
        draft
    };
}

function mapDispatchToProps(dispatch) {
    return bindActionCreators({
        saveDraft
    }, dispatch)
}


class Draft extends Component {
    renderField(field) {
        return (
            <div className="form-group">
                <label>{field.label}</label>
                <input
                    className="form-control"
                    type="text"
                    {...field.input}
                />
            </div>
        )

    }

    onSubmit(values) {
        console.log('sub',values);

        this.props.saveDraft({
            id: values[ID],
            name: values[NAME],
            code: values[SOME_CODE]
        });
    }

    render() {
        const { handleSubmit } = this.props;

        return (
            <form onSubmit={handleSubmit(this.onSubmit.bind(this))}>
                <Field
                    label="Id"
                    name={ID}
                    component={this.renderField}
                />

                <Field
                    label="Name"
                    name={NAME}
                    component={this.renderField}
                />
                <Field
                    label="Lambda code"
                    name={SOME_CODE}
                    component={ReduxAce}
                />

                // if I put it here, then it suddenly works fine <ReduxAce/>
                <button type="submit" className="btn btn-primary"> Submit</button>
            </form>
        );
    }
}

export default reduxForm({
    validate,
    form: 'DraftForm' 
})(
    connect(mapStateToProps, mapDispatchToProps)(Draft)
)

قبل الزر مباشرة ، أضع تعليقًا الآن ، // if I put it here, then it suddenly works fine <ReduxAce/> - لذا نعم ، إذا وضعت محرر Ace على أنه ليس مكون حقل ، فلن يتم حذف قيمته. كيف يمكنك أن ترى ، حاولت استخدام معالج onBlur والحفاظ على القيمة ، لكنني لم أستطع.

شكرا لأية تلميحات!

awaiting response

التعليق الأكثر فائدة

const aceOnBlur = (onBlur) => (_event, editor?) => {
    const value = editor.getValue();
    onBlur(value);
};

...
return (
    <AceEditor
          className={className}
          mode='html'
          theme='monokai'
          enableBasicAutocompletion={true}
          showPrintMargin={false}
          tabSize={4}
          setOptions={options}
          width='1000px'
          name={input.name}
          onBlur={aceOnBlur(input.onBlur)}
          onChange={input.onChange}
          onFocus={input.onFocus}
          value={input.value}
    />
)

يعمل بشكل جيد بالنسبة لي

ال 6 كومينتر

لدي نفس المشكلة. لا أرى مشكلة في الإصدار 5.1.1 ، لكن في 5.8.0 إنها مشكلة. سيتم التحديث إذا كان بإمكاني معرفة ذلك.

const aceOnBlur = (onBlur) => (_event, editor?) => {
    const value = editor.getValue();
    onBlur(value);
};

...
return (
    <AceEditor
          className={className}
          mode='html'
          theme='monokai'
          enableBasicAutocompletion={true}
          showPrintMargin={false}
          tabSize={4}
          setOptions={options}
          width='1000px'
          name={input.name}
          onBlur={aceOnBlur(input.onBlur)}
          onChange={input.onChange}
          onFocus={input.onFocus}
          value={input.value}
    />
)

يعمل بشكل جيد بالنسبة لي

drewenspoonscen - هل لدى أيٍّ منكم اقتراحات حول هذا الأمر كما استخدمتم يا رفاق الشكل المعاد في الماضي؟

avalkowsky - هل يعمل اقتراح JFFby ؟ يقوم onBlur في مثالك بتمرير قيمة الإدخال الحالية إلى reduxForm's onBlur لإعادة تعيين الإدخال ، لكنني لا أعتقد أن هذه القيمة يتم تحديثها أثناء الكتابة. أعتقد أنه يتم إعادة القيمة __الأصلية__ في كل مرة ، وليس القيمة الجديدة التي كتبتها للتو في المحرر ؛ عند العمل مع المكونات المخصصة ، لديك حالتان للعمل بهما: بيانات مخزن نموذج إعادة الإرسال والقيم الفعلية في الإدخال.

drewen سأعطيك بعض التفاصيل غدا!

JFF آسف ، لقد استغرق الأمر وقتًا طويلاً ، عار علي.

الحل الخاص بك يعمل!

@ دروين شكرا ، فاتني ذلك 👍

تضمين التغريدة

لقد قمت أيضًا بخفض إصدار رد فعل إلى 5.1.1 وجربته بدون رد اتصال onBlur ولكنه لم يكن يعمل.
ربما ارتكبت خطأً آخر ، ولكن إذا كنت مطورًا من المستقبل واجهت هذه المشكلة ، فسأستخدم حل JFFbys :)

شكرا جميعا على المساعدة!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات