fix(container): remove sortlist

This commit is contained in:
henson 2018-10-21 13:02:00 +08:00
parent ca0e41e824
commit f4653a40ec
8 changed files with 2611 additions and 2547 deletions

View File

@ -63,10 +63,10 @@ module.exports = {
], ],
}), }),
], ],
externals: { // externals: {
react: 'React', // react: 'React',
'react-dom': 'ReactDOM', // 'react-dom': 'ReactDOM',
}, // },
performance: { performance: {
hints: false, hints: false,
}, },

5048
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -19,7 +19,8 @@ interface SelectProps extends BaseComponentProps {
interface SelectState { interface SelectState {
dropdownListStyles: React.CSSProperties dropdownListStyles: React.CSSProperties
showDropDownList: boolean showDropDownList: boolean,
hasCreateDropList: boolean
} }
export class Select extends React.Component<SelectProps, SelectState> { export class Select extends React.Component<SelectProps, SelectState> {
@ -35,21 +36,25 @@ export class Select extends React.Component<SelectProps, SelectState> {
state = { state = {
dropdownListStyles: {}, dropdownListStyles: {},
showDropDownList: false showDropDownList: false,
hasCreateDropList: false
} }
constructor (props) { constructor (props) {
super(props) super(props)
}
componentDidUpdate() {
console.log('update')
}
componentDidMount () {
// create container element // create container element
const container = document.createElement('div') const container = document.createElement('div')
document.body.appendChild(container) document.body.appendChild(container)
this.$container = container this.$container = container
document.addEventListener('click', this.handleGlobalClick, true) document.addEventListener('click', this.handleGlobalClick, true)
}
componentDidMount () {
this.setState({ dropdownListStyles: this.calculateAttachmentPosition() }) this.setState({ dropdownListStyles: this.calculateAttachmentPosition() })
} }
@ -57,6 +62,23 @@ export class Select extends React.Component<SelectProps, SelectState> {
document.body.removeChild(this.$container) document.body.removeChild(this.$container)
document.removeEventListener('click', this.handleGlobalClick, true) document.removeEventListener('click', this.handleGlobalClick, true)
} }
shouldComponentUpdate(nextProps, nextState) {
if (nextProps.value === this.props.value && nextState.showDropDownList === this.state.showDropDownList) {
return false
}
return true
}
handleShowDropList = () => {
if (!this.state.hasCreateDropList) {
this.setState({
hasCreateDropList: true,
})
}
this.setState({
showDropDownList: true
})
}
private handleGlobalClick = (e) => { private handleGlobalClick = (e) => {
const el = this.$attachment.current const el = this.$attachment.current
@ -118,7 +140,7 @@ export class Select extends React.Component<SelectProps, SelectState> {
render () { render () {
const { value, onSelect, children, className: cn, style } = this.props const { value, onSelect, children, className: cn, style } = this.props
const { dropdownListStyles, showDropDownList } = this.state const { dropdownListStyles, showDropDownList, hasCreateDropList } = this.state
const matchChild = this.getSelectedOption(value, children) const matchChild = this.getSelectedOption(value, children)
const dropDownList = ( const dropDownList = (
<div <div
@ -137,12 +159,12 @@ export class Select extends React.Component<SelectProps, SelectState> {
className={classnames('select', cn)} className={classnames('select', cn)}
style={style} style={style}
ref={this.$target} ref={this.$target}
onClick={() => this.setState({ showDropDownList: !showDropDownList })} onClick={this.handleShowDropList}
> >
{matchChild.props.children} {matchChild.props.children}
<Icon type="triangle-down" /> <Icon type="triangle-down" />
</div> </div>
{createPortal(dropDownList, this.$container)} {hasCreateDropList && createPortal(dropDownList, this.$container)}
</> </>
} }
} }

View File

@ -16,7 +16,7 @@
} }
.select-list { .select-list {
position: fixed; position: absolute;
max-width: 170px; max-width: 170px;
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;

View File

@ -33,7 +33,7 @@ export default class App extends React.Component<AppProps, {}> {
<div className="page-container"> <div className="page-container">
{ {
routes.map( routes.map(
route => <Route exact={!!route.exact} path={route.path} component={route.component}/> route => <Route exact={!!route.exact} path={route.path} key={route.path} component={route.component}/>
) )
} }
</div> </div>

View File

@ -25,7 +25,48 @@ class Rules extends React.Component<I18nProps, RulesState> {
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'google.com.hk', proxy: 'HK' }, { type: RuleType['DOMAIN-SUFFIX'], payload: 'google.com.hk', proxy: 'HK' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' }, { type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' }, { type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['FINAL'], payload: '', proxy: 'DIRECT' } { type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN-SUFFIX'], payload: 'twitter.com', proxy: 'HKG' },
{ type: RuleType['DOMAIN'], payload: 'pornhub.com', proxy: 'HKG' },
], ],
proxies: { proxies: {
DIRECT: { type: 'Direct' }, DIRECT: { type: 'Direct' },
@ -115,7 +156,6 @@ class Rules extends React.Component<I18nProps, RulesState> {
const { modifiedIndex, proxies } = this.state const { modifiedIndex, proxies } = this.state
const isFinal = rule.type === 'FINAL' const isFinal = rule.type === 'FINAL'
const DragHandle = SortableHandle(() => <Icon type="drag" size={16} />) const DragHandle = SortableHandle(() => <Icon type="drag" size={16} />)
return ( return (
<li className="rule-item" key={index}> <li className="rule-item" key={index}>
<Row className="rule-item-row" gutter={24} align="middle"> <Row className="rule-item-row" gutter={24} align="middle">
@ -127,7 +167,7 @@ class Rules extends React.Component<I18nProps, RulesState> {
isFinal isFinal
? rule.type ? rule.type
: ( : (
<Select value={rule.type} onSelect={type => this.handleModifyType(index, type)}> <Select key={index} value={rule.type} onSelect={type => this.handleModifyType(index, type)}>
{ {
Object.keys(RuleType) Object.keys(RuleType)
.filter(type => type !== 'FINAL') .filter(type => type !== 'FINAL')
@ -162,7 +202,7 @@ class Rules extends React.Component<I18nProps, RulesState> {
} }
</Col> </Col>
<Col className="rule-proxy" span={5}> <Col className="rule-proxy" span={5}>
<Select className="rule-proxy-option" value={rule.proxy} onSelect={proxy => this.handleModifyProxy(index, proxy)}> <Select className="rule-proxy-option" key={index} value={rule.proxy} onSelect={proxy => this.handleModifyProxy(index, proxy)}>
{ {
Object.keys(proxies).map(proxyName => { Object.keys(proxies).map(proxyName => {
const proxy = proxies[proxyName] const proxy = proxies[proxyName]
@ -188,7 +228,6 @@ class Rules extends React.Component<I18nProps, RulesState> {
const { t } = this.props const { t } = this.props
const { rules } = this.state const { rules } = this.state
const SortableList = SortableContainer<{ rules: Rule[] }>(this.renderRules) const SortableList = SortableContainer<{ rules: Rule[] }>(this.renderRules)
return ( return (
<div className="page"> <div className="page">
<Header title={t('title')} > <Header title={t('title')} >
@ -197,7 +236,10 @@ class Rules extends React.Component<I18nProps, RulesState> {
<Card className="rules-card"> <Card className="rules-card">
<div className="rules"> <div className="rules">
<SortableList rules={rules} onSortEnd={this.onSortEnd} useDragHandle={true} /> {
rules.map((rule: Rule, index )=> this.renderRuleItem(rule, index))
}
{/* <SortableList rules={rules} onSortEnd={this.onSortEnd} useDragHandle={true} /> */}
</div> </div>
</Card> </Card>
</div> </div>

View File

@ -24,7 +24,7 @@ class Sidebar extends React.Component<SidebarProps, {}> {
{ {
routes.map( routes.map(
({ path, name, exact }) => ( ({ path, name, exact }) => (
<li className="item"> <li className="item" key={name}>
<NavLink to={path} activeClassName="active" exact={!!exact}>{ t(name) }</NavLink> <NavLink to={path} activeClassName="active" exact={!!exact}>{ t(name) }</NavLink>
</li> </li>
) )

View File

@ -9,7 +9,7 @@
<div id="root"></div> <div id="root"></div>
<!-- Dependencies --> <!-- Dependencies -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.2/umd/react.production.min.js" integrity="sha256-2EQx5J1ux3sjgPLtDevlo449XNXfvEplcRYWIF6ui8w=" crossorigin="anonymous"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.4.2/umd/react.production.min.js" integrity="sha256-2EQx5J1ux3sjgPLtDevlo449XNXfvEplcRYWIF6ui8w=" crossorigin="anonymous"></script> -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.2/umd/react-dom.production.min.js" integrity="sha256-3NNU/yoE0R7VxxapKiw/hkgQzcSMztyclb5RpeVlV7Y=" crossorigin="anonymous"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.4.2/umd/react-dom.production.min.js" integrity="sha256-3NNU/yoE0R7VxxapKiw/hkgQzcSMztyclb5RpeVlV7Y=" crossorigin="anonymous"></script> -->
</body> </body>
</html> </html>