человек, который имеет в копилке каждый из ваших пунктов, по определению не может не иметь опыта.
ИМХО, теория без практики - хуже, чем практика без углубленной теории. теория без практики - хуже
const array = JSON.parse(SOME_JSON);
[{"name1": "Some_name1", "id": 123 }, {"name2": "Some_name2", "id": 987 }]
[{ title: "Some_name1", value: 123 }, { title: "Some_name2", value: 987 }]
const options = [
{
title: "Some name",
value: '1',
},
{
title: "Some name 2",
value: '2',
},
];
return (
<select name="someName" value={someValue} onChange={this.handleChange}>
{options.map(option => (
<option value={option.value}>{option.title}</option>
))}
</select>
);
interface Props {
name?: string
value?: string
values?: string[]
defaultValue?: string
placeholder?: string
options: Array<{
title: string
value: string
}>
onChange?: Function
className?: string
multiple?: boolean
}
interface State {
value: string
values: string[]
}
class DropdownSelect extends React.Component<Props, State> {
static displayName = 'DropdownSelect';
static Option = Option;
static OptionsList = OptionsList;
state = {
value: this.props.value || null,
values: this.props.values || [],
isOpened: false,
};
get value() {
return this.state.value;
}
get values() {
return this.state.values;
}
componentDidMount() {
}
componentWillReceiveProps(nextProps) {
if (nextProps.value !== this.props.value) {
this.setState({ value: nextProps.value });
}
if (nextProps.values !== this.props.values) {
this.setState({ values: nextProps.values });
}
}
componentDidUpdate(prevProps: Props, prevState: State) {
}
componentWillUnmount() {
}
shouldComponentUpdate(nextProps: Props, nextState: State) {
return true;
}
handleOptionClick = value => {
const { onChange, name } = this.props;
onChange({ target: { name, value } });
this.setState({ value });
};
handleMultiOptionChange = e => {
const { onChange, name } = this.props;
const target = e.target as HTMLInputElement;
const values = _.xor(this.state.values, [target.name]);
this.setState({ values }, () => {
onChange({ target: { name, value: values } });
});
};
getCurrentValue() {
const { value } = this.state;
}
renderSimpleOptionsList() {
const { options } = this.props;
return (
<OptionsList className="react-list">
{options.map(option => (
<Option
key={option.value}
isActive={this.state.value === option.value}
onClick={() => this.handleOptionClick(option.value)}>{option.title}</Option>
))}
</OptionsList>
);
}
renderMultipleOptionsList() {
const { options } = this.props;
const { values } = this.state;
return (
<OptionsList className="react-list">
{options.map(option => (
<OptionWrapper
key={option.value}
>
<StyledCheckBox
onChange={this.handleMultiOptionChange}
name={option.value}
checked={(values as ArrayWithIncludes<string>).includes(option.value)}
>
{option.title}
</StyledCheckBox>
</OptionWrapper>
))}
</OptionsList>
);
}
renderOptionsList() {
const { options, multiple } = this.props;
return multiple ? this.renderMultipleOptionsList() : this.renderSimpleOptionsList();
}
@withRaven
render() {
const { options, placeholder = 'Select', className, multiple } = this.props;
const { value } = this.state;
const currentValue = (!multiple && value) ?
(options as ArrayWithFind<{ title: string, value: string }>).find(option => option.value === value).title : placeholder;
return (
<Wrapper className={className}>
<Dropdown closeOnClickInside={!multiple} dropdown={this.renderOptionsList()}>
{!this.props.children && <Value>{currentValue}<ArrowDown src={require('img/newweb/ic-arrow-menu.svg')} /></Value>}
{this.props.children}
</Dropdown>
</Wrapper>
);
}
}
export default DropdownSelect;
import * as React from 'react';
import styled from 'styled-components';
import withRaven from '../../../lib/withRaven';
const Wrapper = styled.div`
position: relative;
display: inline-block;
`;
const Head = styled.div`
`;
const Body = styled.div`
position: absolute;
top: 100%;
width: 100%;
`;
interface Props {
dropdown: any
onShow?: Function
onHide?:Function
className?: string
closeOnClickOutside?: boolean
closeOnClickInside?: boolean
}
interface State {
isActive: boolean
}
class Dropdown extends React.Component<Props, State> {
static Head = Head;
static Body = Body;
static displayName = 'Dropdown';
static defaultProps = {
closeOnClickInside: true,
closeOnClickOutside: true,
};
state = {
isActive: false,
};
wrapper: HTMLDivElement;
getWrapperRef = node => this.wrapper = node;
shouldComponentUpdate(nextProps: Props, nextState: State) {
return nextProps.dropdown !== this.props.dropdown ||
nextState.isActive !== this.state.isActive;
}
componentWillUnmount() {
this.removeOutsideClickListener();
}
onClick = () => {
this.setState(prevState => ({
isActive: !prevState.isActive,
}), () => {
this.state.isActive ? this.onShow() : this.onHide();
});
};
onWrapperClick = () => {
};
onHeadClick = () => {
this.setState(prevState => ({
isActive: !prevState.isActive,
}), () => {
this.state.isActive ? this.onShow() : this.onHide();
});
};
onBodyClick = () => {
if (this.props.closeOnClickInside) {
this.setState({ isActive: false }, this.onHide);
}
};
onShow() {
const { onShow, closeOnClickOutside } = this.props;
if (closeOnClickOutside) {
this.addOutsideClickListener();
}
if (onShow) {
onShow();
}
}
onHide() {
const { onHide, closeOnClickOutside } = this.props;
if (closeOnClickOutside) {
this.removeOutsideClickListener();
}
if (onHide) {
onHide();
}
}
addOutsideClickListener() {
document.addEventListener('mousedown', this.onClickOutside);
}
removeOutsideClickListener() {
document.removeEventListener('mousedown', this.onClickOutside);
}
onClickOutside = e => {
const { onHide } = this.props;
if (this.wrapper && !this.wrapper.contains(e.target)) {
this.setState({ isActive: false });
}
if (onHide) {
onHide();
}
};
@withRaven
render() {
const {
children,
dropdown,
className,
} = this.props;
const { isActive } = this.state;
return(
<Wrapper
className={className}
innerRef={this.getWrapperRef}
>
<Head onClick={this.onHeadClick}>{children}</Head>
{isActive && <Body onClick={this.onBodyClick}>{dropdown}</Body>}
</Wrapper>
);
}
}
export default Dropdown;
const MyInput = props => {
const { onChange } = this.props;
const id = this.props['data-id'];
const name = this.props['data-name'];
return <input onChange={onChange} data-id={id} data-name={name} />;
};
Уже практически переписывал все с нуля, по документации jquery пытался все сделать, но комментарии не отправляются в бд и не выводятся.
А если форм допустим 30 или 50?
И данные с формы допустим нужны будут children of parent component children's
но если в проекте есть уже redux, то было бы разумно использовать store??
<script>
window.__data = {
ACCOUNTS: '...',
};
</script>
el.value.slice(0, start)
- часть строки до выделенияel.value.slice(start, end)
- выделенная часть строкиel.value.slice(end)
- часть строки после выделенияwrapper
- имя тега