لدي مشكلة مشابهة لـ 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 والحفاظ على القيمة ، لكنني لم أستطع.
شكرا لأية تلميحات!
لدي نفس المشكلة. لا أرى مشكلة في الإصدار 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 :)
شكرا جميعا على المساعدة!
التعليق الأكثر فائدة
يعمل بشكل جيد بالنسبة لي