Чи існує еквівалент цього CSS у React Native, щоб програма використовувала однаковий шрифт скрізь?
body {
font-family: 'Open Sans';
}
Застосування його вручну на кожному вузлі Text здається надто складним.
Чи існує еквівалент цього CSS у React Native, щоб програма використовувала однаковий шрифт скрізь?
body {
font-family: 'Open Sans';
}
Застосування його вручну на кожному вузлі Text здається надто складним.
Відповіді:
Рекомендований спосіб - створити власний компонент, такий як MyAppText. MyAppText був би простим компонентом, який відображає компонент Text за допомогою вашого універсального стилю і може проходити через інші реквізити тощо.
https://facebook.github.io/react-native/docs/text.html#limited-style-inheritance
render()
замість конструктора. Використання гачків useMemo
також може допомогти, якщо ефективність важлива. Крім того, якщо ви хочете зберегти його в конструкторі, важливо додати componentDidUpdate
логіку, яка оновлюється, this.style
коли компонент оновлюється через зміну властивості стилю.
Нещодавно був створений модуль вузла, який вирішує цю проблему, тому вам не потрібно створювати інший компонент .
https://github.com/Ajackster/react-native-global-props
https://www.npmjs.com/package/react-native-global-props
У документації зазначено, що в компоненті вищого порядку імпортуйте setCustomText
функцію так.
import { setCustomText } from 'react-native-global-props';
Потім створіть власний стиль / реквізит, який ви хочете реагувати на рідний Text
компонент. У вашому випадку ви хотіли б, щоб fontFamily працював над кожним Text
компонентом.
const customTextProps = {
style: {
fontFamily: yourFont
}
}
Викличте setCustomText
функцію та передайте свої функції / стилі у функцію.
setCustomText(customTextProps);
І тоді всі реакційніText
компоненти матимуть ваш оголошений fontFamily разом з будь-яким іншим реквізитом / стилем, який ви надаєте.
<Text style={styles.text}>
?? Це не ідеальне рішення, подібне тому body {font-family: 'Open Sans';}
, якесь рішення для оновлення ??
Text style={styles.text}>
. Вам просто потрібно декларувати свій власний реквізит десь у вашій програмі, і він буде застосований до всіх ваших компонентів Text. Це дуже схоже наbody {font-family: ....}
Для React Native 0.56.0+ перевірте, чи спочатку визначено defaultProps:
Text.defaultProps = Text.defaultProps || {}
Потім додайте:
Text.defaultProps.style = { fontFamily: 'some_font' }
Додайте вищевказане в конструктор файлу App.js (або будь-який кореневий компонент, який у вас є).
Щоб замінити стиль, ви можете створити об'єкт стилю та розповсюдити його, а потім додати свій додатковий стиль (наприклад { ...baseStyle, fontSize: 16 }
)
defaultProps
цього не існувало, коли були написані всі інші відповіді, але, схоже, це спосіб зробити це зараз.
style
скасуємо, наприклад, налаштування стилів певних Text
компонентів
style
проп у компоненті Текст, шрифт за замовчуванням буде замінено.
Ви можете замінити поведінку тексту, додавши це до будь-якого з компонентів за допомогою тексту:
let oldRender = Text.prototype.render;
Text.prototype.render = function (...args) {
let origin = oldRender.call(this, ...args);
return React.cloneElement(origin, {
style: [{color: 'red', fontFamily: 'Arial'}, origin.props.style]
});
};
Змінити: оскільки React Native 0.56 Text.prototype
більше не працює. Вам потрібно видалити .prototype
:
let oldRender = Text.render;
Text.render = function (...args) {
let origin = oldRender.call(this, ...args);
return React.cloneElement(origin, {
style: [{color: 'red', fontFamily: 'Arial'}, origin.props.style]
});
};
Додати
"rnpm": {
"assets": [
"./assets/fonts/"
]
}
в package.json
потім запуститиreact-native link
З React-Native 0.56, наведений вище спосіб зміни Text.prototype.render
вже не працює, тому вам доведеться використовувати свій власний компонент, що можна зробити в один рядок!
MyText.js
export default props => <Text {...props} style={[{fontFamily: 'Helvetica'}, props.style]}>{props.children}</Text>
AnotherComponent.js
import Text from './MyText';
...
<Text>This will show in default font.</Text>
...
useRef
. responsejs.org/docs/hooks-reference.html#useref
Додайте цю функцію до кореневого App
компонента, а потім запустіть її з конструктора після додавання шрифту, дотримуючись цих інструкцій. https://medium.com/react-native-training/react-native-custom-fonts-ccc9aacf9e5e
import {Text, TextInput} from 'react-native'
SetDefaultFontFamily = () => {
let components = [Text, TextInput]
const customProps = {
style: {
fontFamily: "Rubik"
}
}
for(let i = 0; i < components.length; i++) {
const TextRender = components[i].prototype.render;
const initialDefaultProps = components[i].prototype.constructor.defaultProps;
components[i].prototype.constructor.defaultProps = {
...initialDefaultProps,
...customProps,
}
components[i].prototype.render = function render() {
let oldProps = this.props;
this.props = { ...this.props, style: [customProps.style, this.props.style] };
try {
return TextRender.apply(this, arguments);
} finally {
this.props = oldProps;
}
};
}
}
const App = StackNavigator({...})
і export default App
де саме я б розмістив цей код, оскільки я не думаю, що можу використовувати тут конструктор?
Супер пізно до цієї теми, але тут все йде.
TLDR; Додайте наступний блок уAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
....
// HERE: replace "Verlag" with your font
[[UILabel appearance] setFont:[UIFont fontWithName:@"Verlag" size:17.0]];
....
}
Кілька способів зробити це за межами використання плагіна, наприклад, react-native-global-props
так що я буду вас ходити крок за кроком.
Спочатку давайте створимо місце для наших активів. Давайте зробимо наступний каталог у нашому корені.
``
ios/
static/
fonts/
``
Тепер додамо NPM "React Native" у наш пакет.json
"rnpm": {
"static": [
"./static/fonts/"
]
}
Тепер ми можемо запустити "реагувати на рідне посилання", щоб додати наші ресурси до наших рідних додатків.
Це має додати ваші імена шрифтів до проектів .plist
(для запуску користувачів коду VS code ios/*/Info.plist
для підтвердження)
Тут припустимо, що Verlag
це шрифт, який ви додали, він повинен виглядати приблизно так:
<dict>
<plist>
.....
<key>UIAppFonts</key>
<array>
<string>Verlag Bold Italic.otf</string>
<string>Verlag Book Italic.otf</string>
<string>Verlag Light.otf</string>
<string>Verlag XLight Italic.otf</string>
<string>Verlag XLight.otf</string>
<string>Verlag-Black.otf</string>
<string>Verlag-BlackItalic.otf</string>
<string>Verlag-Bold.otf</string>
<string>Verlag-Book.otf</string>
<string>Verlag-LightItalic.otf</string>
</array>
....
</dict>
</plist>
Тепер, коли ви їх зіставили, тепер давайте переконаємось, що вони насправді там і завантажуються (це також, як ви робите це вручну).
Перейдіть до "Build Phase" > "Copy Bundler Resource"
, якщо це не спрацювало, ви вручну додасте їх тут.
Спочатку відкрийте свої журнали XCode, наприклад:
Потім ви можете додати наступний блок, щоб AppDelegate.m
записати імена шрифтів та сімейства шрифтів.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
.....
for (NSString* family in [UIFont familyNames])
{
NSLog(@"%@", family);
for (NSString* name in [UIFont fontNamesForFamilyName: family])
{
NSLog(@" %@", name);
}
}
...
}
Після запуску ви повинні знайти свої шрифти, якщо вони завантажені правильно, тут ми знайшли наш у таких журналах:
2018-05-07 10:57:04.194127-0700 MyApp[84024:1486266] Verlag
2018-05-07 10:57:04.194266-0700 MyApp[84024:1486266] Verlag-Book
2018-05-07 10:57:04.194401-0700 MyApp[84024:1486266] Verlag-BlackItalic
2018-05-07 10:57:04.194516-0700 MyApp[84024:1486266] Verlag-BoldItalic
2018-05-07 10:57:04.194616-0700 MyApp[84024:1486266] Verlag-XLight
2018-05-07 10:57:04.194737-0700 MyApp[84024:1486266] Verlag-Bold
2018-05-07 10:57:04.194833-0700 MyApp[84024:1486266] Verlag-Black
2018-05-07 10:57:04.194942-0700 MyApp[84024:1486266] Verlag-XLightItalic
2018-05-07 10:57:04.195170-0700 MyApp[84024:1486266] Verlag-LightItalic
2018-05-07 10:57:04.195327-0700 MyApp[84024:1486266] Verlag-BookItalic
2018-05-07 10:57:04.195510-0700 MyApp[84024:1486266] Verlag-Light
Отже, тепер ми знаємо, що це завантажило Verlag
сім’ю та є шрифтами всередині цієї сім’ї
Verlag-Book
Verlag-BlackItalic
Verlag-BoldItalic
Verlag-XLight
Verlag-Bold
Verlag-Black
Verlag-XLightItalic
Verlag-LightItalic
Verlag-BookItalic
Verlag-Light
Це тепер чутливі до регістру імена, які ми можемо використовувати в нашому сімействі шрифтів, які ми можемо використовувати в нашому рідному додатку для реагування.
Потім встановити шрифт за замовчуванням, щоб додати назву вашої родини шрифтів AppDelegate.m
до цього за допомогою цього рядка
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
....
// ADD THIS LINE (replace "Verlag" with your font)
[[UILabel appearance] setFont:[UIFont fontWithName:@"Verlag" size:17.0]];
....
}
Готово.
Це працює для мене: додайте власний шрифт у React Native
завантажте шрифти та розмістіть їх у папці resources / fonts, додайте цей рядок у package.json
"rnpm": {
"assets": ["assets/fonts/Sarpanch"]}
потім відкрийте термінал і запустіть цю команду: response-native link
Тепер вам добре йти. Для більш детального кроку. відвідайте вищезгадане посилання