#reactjs #this
#reactjs #это
Вопрос:
Я как бы переходил на React, когда функции без состояния были популярны, поэтому я никогда не сталкивался с классовым подходом к этому, что меня сейчас беспокоит..
Я не уверен, что делает эта функция:
var keywordMapper = this.createKeywordMapper({
"constant.false": 'false',
"constant.true": 'true',
}, "identifier", true);
Который вызывается как:
this.$rules = {
"start": [{
token: "constant.numeric", // float
regex: "[ -]?\d (?:(?:\.\d*)?(?:[eE][ -]?\d )?)?\b"
}, {
token: keywordMapper,
regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\b"
}, {
token: "keyword.operator",
regex: "\ |\-|\/|\/\/|%|<@>|@>|<@|amp;|\^|~|<|>|<=|=>|==|!=|<>|="
}]
};
Я думаю, что он отображает входные данные (какие входные данные) и возвращает либо ‘false’, ‘true’, либо ‘identifier’ по умолчанию.
Но что, если я хочу использовать его в функциональном компоненте без состояния? Поскольку я не могу использовать это там.
Любая помощь или объяснение того, как работает «эта» функция, очень ценится.
Приветствую,
редактировать: весь эффект использования:
useEffect(() => {
const newCompleter = {
getCompletions(editor, session, pos, prefix, callback) {
callback(null, completions);
},
};
const keywordMapper = this.createKeywordMapper({
"constant.false": 'false',
"constant.true": 'true',
}, "identifier", true);
const completionString = completions.map((x) => x.value).join('|');
const session = editor.current.editor.getSession();
session.setMode(`ace/mode/text`, () => {
const rules = session.$mode.$highlightRules.getRules();
if (Object.prototype.hasOwnProperty.call(rules, 'start')) {
rules.start = [
{
token: 'constant.numeric', // float
regex: '[ -]?\d (?:(?:\.\d*)?(?:[eE][ -]?\d )?)?\b',
},
{
token: keywordMapper(),
regex: '[a-zA-Z_$][a-zA-Z0-9_$]*\b',
},
{
token: 'keyword.operator',
regex:
'\ |\-|\/|\/\/|%|<@>|@>|<@|amp;|\^|~|<|>|<=|=>|==|!=|<>|=',
},
];
}
// }
// force recreation of tokenizer
session.$mode.$tokenizer = null;
session.bgTokenizer.setTokenizer(session.$mode.getTokenizer());
// force re-highlight whole document
session.bgTokenizer.start(0);
});
// to extend existing
// addCompleter(myCompleter);
// to override all
setCompleters([newCompleter]);
}, [completions]);
Исходный компонент класса
ace.define("ace/mode/brms_highlight_rules", ["require", "exports",
"module", "ace/lib/oop", "ace/mode/text_highlight_rules"], function(require, exports, module) {
"use strict";
var oop = require("../lib/oop");
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
var BrmsHighlightRules = function() {
var FalseBool = (
"false"
);
var TrueBool = (
"true"
);
var keywordMapper = this.createKeywordMapper({
"constant.false": 'false',
"constant.true": 'true',
}, "identifier", true);
this.$rules = {
"start": [{
token: "constant.numeric", // float
regex: "[ -]?\d (?:(?:\.\d*)?(?:[eE][ -]?\d )?)?\b"
}, {
token: keywordMapper,
regex: "[a-zA-Z_$][a-zA-Z0-9_$]*\b"
}, {
token: "keyword.operator",
regex: "\ |\-|\/|\/\/|%|<@>|@>|<@|amp;|\^|~|<|>|<=|=>|==|!=|<>|="
}]
};
this.normalizeRules();
};
oop.inherits(BrmsHighlightRules, TextHighlightRules);
exports.BrmsHighlightRules = BrmsHighlightRules;
});
ace.define("ace/mode/brms", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/brms_highlight_rules"], function(require, exports, module) {
"use strict";
var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var BrmsHighlightRules = require("./brms_highlight_rules").BrmsHighlightRules;
var Mode = function() {
this.HighlightRules = BrmsHighlightRules;
this.$behaviour = this.$defaultBehaviour;
};
oop.inherits(Mode, TextMode);
(function() {
this.$id = "ace/mode/brms";
}).call(Mode.prototype);
exports.Mode = Mode;
});
(function() {
ace.require(["ace/mode/brms"], function(m) {
if (typeof module == "object" amp;amp; typeof exports == "object" amp;amp; module) {
module.exports = m;
}
});
})();
Комментарии:
1. В функциональных компонентах
this
просто не определено, поскольку функциональные компоненты более или менее «без экземпляра».var keywordMapper = this.createKeywordMapper({....})
вызываетcreateKeywordMapper
и сохраняет результат,keyworkMapper
используемый позже в$rules
объекте. Можете ли вы включить свою попытку создания функционального компонента в свой вопрос, включить любой и весь соответствующий код?2. Привет, Дрю, спасибо за твой ответ. Так правильно ли, что createKeywordMapper вообще не является функцией? Просто форма объекта?
3. Нет,
createKeywordMapper
совершенно очевидно, что это функция, она вызывается с несколькими аргументами и возвращает значение. То, что он возвращает, похоже, является строкой «токена» или, возможно, объектом с параметрами токена. Нам нужно было бы увидеть его реализацию, чтобы убедиться наверняка.4. Хорошо, я добавил исходный код, который я хочу перевести в функциональный компонент. Что вы имеете в виду, что он вызывается несколькими аргументами? Я вижу, что он появляется только один раз?
5. Является ли этот код, который вы пытаетесь преобразовать в функциональный компонент React, даже связанным с React? Это выглядит решительно очень не реагирующим. Я сказал, что вызывается с несколькими аргументами , т.е.
createKeywordMapper (arg0, arg1, arg2)
. В любом случае вам нужно будет импортировать / определить всеthis.XYZ
функции, принадлежащие классу, им не понадобитсяthis
бит для вызова.