Skip to content

Commit b389610

Browse files
inter-actionsam019
authored andcommitted
bugfix: fix refs change due to re-rendering that breaks resize method's contract
1 parent 5b88607 commit b389610

File tree

3 files changed

+23
-13
lines changed

3 files changed

+23
-13
lines changed

src/carousel/Carousel.jsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ export default class Carousel extends Component {
4040
this.throttledIndicatorHover = throttle(300, index => {
4141
this.handleIndicatorHover(index);
4242
});
43+
44+
this.resetItemPosition = this._resetItemPosition.bind(this)
4345
}
4446

4547
getChildContext(): Context {
@@ -49,7 +51,7 @@ export default class Carousel extends Component {
4951
}
5052

5153
componentDidMount() {
52-
addResizeListener(this.refs.root, this.resetItemPosition.bind(this));
54+
5355

5456
if (this.props.initialIndex < this.state.items.length && this.props.initialIndex >= 0) {
5557
this.setState({
@@ -61,6 +63,8 @@ export default class Carousel extends Component {
6163
}
6264

6365
componentDidUpdate(props: Object, state: State): void {
66+
addResizeListener(this.refs.root, this.resetItemPosition);
67+
6468
if (state.activeIndex != this.state.activeIndex) {
6569
this.resetItemPosition(state.activeIndex);
6670

@@ -71,7 +75,7 @@ export default class Carousel extends Component {
7175
}
7276

7377
componentWillUnmount(): void {
74-
removeResizeListener(this.refs.root, this.resetItemPosition.bind(this));
78+
removeResizeListener(this.refs.root, this.resetItemPosition);
7579
}
7680

7781
handleMouseEnter(): void {
@@ -112,7 +116,7 @@ export default class Carousel extends Component {
112116
});
113117
}
114118

115-
resetItemPosition(oldIndex: number): void {
119+
_resetItemPosition(oldIndex: number): void {
116120
this.state.items.forEach((item, index) => {
117121
item.translateItem(index, this.state.activeIndex, oldIndex);
118122
});

src/scrollbar/Scrollbar.jsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ export class Scrollbar extends Component {
1818
moveX: 0,
1919
moveY: 0
2020
};
21+
22+
this.update = this._update.bind(this)
2123
}
2224

2325
get wrap(){
@@ -26,19 +28,22 @@ export class Scrollbar extends Component {
2628

2729
componentDidMount(){
2830
if (this.native) return;
29-
let handler = this.update.bind(this)
30-
let rafId = requestAnimationFrame(handler)
31+
let rafId = requestAnimationFrame(this.update)
3132
this.cleanRAF = ()=>{
3233
cancelAnimationFrame(rafId)
3334
}
34-
this.resize = ReactDOM.findDOMNode(this.refs.resize)
35+
}
36+
37+
componentDidUpdate() {
38+
this.resizeDom = ReactDOM.findDOMNode(this.refs.resize)
3539
if (!this.props.noresize){
36-
addResizeListener(this.resize, handler)
40+
addResizeListener(this.resizeDom, this.update)
3741
this.cleanResize = ()=>{
38-
removeResizeListener(this.resize, handler);
42+
removeResizeListener(this.resizeDom, this.update);
3943
}
4044
}
4145
}
46+
4247

4348
componentWillUnmount(){
4449
this.cleanRAF();
@@ -53,7 +58,7 @@ export class Scrollbar extends Component {
5358
})
5459
}
5560

56-
update() {
61+
_update() {
5762
let heightPercentage, widthPercentage;
5863
const wrap = this.wrap;
5964
if (!wrap) return;

src/select/Select.jsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class Select extends Component {
9191
this.debouncedOnInputChange = debounce(this.debounce(), () => {
9292
this.onInputChange();
9393
});
94+
95+
this.resetInputWidth = this._resetInputWidth.bind(this)
9496
}
9597

9698
getChildContext(): Object {
@@ -100,8 +102,6 @@ class Select extends Component {
100102
}
101103

102104
componentDidMount() {
103-
addResizeListener(this.refs.root, this.resetInputWidth.bind(this));
104-
105105
this.reference = ReactDOM.findDOMNode(this.refs.reference);
106106
this.popper = ReactDOM.findDOMNode(this.refs.popper);
107107

@@ -150,10 +150,11 @@ class Select extends Component {
150150

151151
componentDidUpdate() {
152152
this.state.inputWidth = this.reference.getBoundingClientRect().width;
153+
addResizeListener(this.refs.root, this.resetInputWidth);
153154
}
154155

155156
componentWillUnmount() {
156-
removeResizeListener(this.refs.root, this.resetInputWidth.bind(this));
157+
removeResizeListener(this.refs.root, this.resetInputWidth);
157158
}
158159

159160
debounce(): number {
@@ -552,7 +553,7 @@ class Select extends Component {
552553
});
553554
}
554555

555-
resetInputWidth() {
556+
_resetInputWidth() {
556557
this.setState({
557558
inputWidth: this.reference.getBoundingClientRect().width
558559
})

0 commit comments

Comments
 (0)