Я использую React и JSS, чтобы попытаться создать небольшой набор повторно используемых компонентов, но я сталкиваюсь с проблемами, пытаясь объединить базовые компоненты в более сложные.
Когда я передаю имена классов внизиз родительского компонента с помощью classes
, он полностью переопределяет стили по умолчанию, а не объединяет их.См. Фрагмент ниже для демонстрации: при переносе текстовый ввод теряет стили границ и принимает только ширину, указанную в оболочке.
const { Component } = React;
const { render } = ReactDOM;
const injectSheet = reactJss.default;
// TextInput.jsx
const TextInput = (() => {
const styles = {
root: {
border: '1px solid #ccc',
borderRadius: 3,
}
};
const TextInput = ({ classes, ...rest }) => (
<input className={classes.root} type="text" {...rest} />
);
return injectSheet(styles)(TextInput);
})();
// InputField.jsx
const InputField = (() => {
const styles = {
root: {
display: 'inline-flex',
},
label: {
marginRight: 5,
width: 40,
},
input: {
width: 80,
},
};
const InputField = ({ classes, id, label }) => (
<span className={classes.root}>
<label className={classes.label} htmlFor={id}>{label}</label>
<TextInput classes={{root: classes.input}} id={id} />
</span>
);
return injectSheet(styles)(InputField);
})();
// Demonstration
class App extends Component {
render() {
return (
<dl>
<dt>Without Wrapper:</dt>
<dd><TextInput /></dd>
<dt>With Wrapper:</dt>
<dd><InputField id="f" label="Foo"/></dd>
<dt>What I want:</dt>
<dd><InputField classes={{input: 'generated-by-TextInput-root generated-by-InputField-input'}} id="b" label="Foo"/></dd>
</dl>
);
}
}
render(<App />, document.getElementById('root'));
.generated-by-TextInput-root {
border: 1px solid #ccc;
border-radius: 3px;
}
.generated-by-InputField-input {
width: 80px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jss/9.8.7/jss.min.js"></script>
<script src="https://unpkg.com/react-jss@8.6.1/dist/react-jss.min.js"></script>
<div id="root"></div>
Вместо простого переопределения имени класса, сгенерированного внутренним компонентом, я хочу применить этот класс, а затем пользовательские стили внешних компонентов поверхЭто.По сути, я бы хотел, чтобы classes
опора работала в добавке .
Есть ли способ сделать это изящно?