Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit 1145fa5

Browse files
authored
Merge pull request #70 from makotot/onupdate
add onupdate
2 parents 8acfa5c + eb21c16 commit 1145fa5

File tree

6 files changed

+797
-561
lines changed

6 files changed

+797
-561
lines changed

.eslintrc

-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
{
22
"parser": "babel-eslint",
3-
"ecmaFeatures": {
4-
"jsx": true
5-
},
63

74
"plugins": [
85
"react"

package.json

+16-16
Original file line numberDiff line numberDiff line change
@@ -33,42 +33,42 @@
3333
"author": "makotot",
3434
"license": "MIT",
3535
"devDependencies": {
36-
"autoprefixer": "^7.1.1",
37-
"ava": "^0.19.1",
36+
"autoprefixer": "^7.1.2",
37+
"ava": "^0.22.0",
3838
"babel-cli": "^6.24.1",
3939
"babel-core": "^6.25.0",
4040
"babel-eslint": "^7.2.3",
41-
"babel-loader": "^7.0.0",
41+
"babel-loader": "^7.1.1",
4242
"babel-plugin-transform-object-assign": "^6.22.0",
4343
"babel-plugin-transform-runtime": "^6.23.0",
44-
"babel-preset-env": "^1.5.2",
44+
"babel-preset-env": "^1.6.0",
4545
"babel-preset-react": "^6.24.1",
4646
"babel-preset-react-hmre": "^1.1.1",
4747
"construct-css": "https://github.com/makotot/construct.git",
4848
"css-loader": "^0.28.4",
4949
"cssnano": "^3.10.0",
50-
"enzyme": "^2.8.2",
51-
"eslint": "^3.19.0",
52-
"eslint-loader": "^1.7.1",
53-
"eslint-plugin-react": "^7.0.1",
54-
"html-webpack-plugin": "^2.28.0",
50+
"enzyme": "^2.9.1",
51+
"eslint": "^4.4.1",
52+
"eslint-loader": "^1.9.0",
53+
"eslint-plugin-react": "^7.2.1",
54+
"html-webpack-plugin": "^2.30.1",
5555
"node-sass": "^4.5.3",
5656
"normalize.css": "^7.0.0",
57-
"postcss-loader": "^1.3.3",
57+
"postcss-loader": "^2.0.6",
5858
"react-addons-perf": "^15.4.2",
5959
"react-highlight": "^0.10.0",
60-
"react-test-renderer": "^15.5.4",
61-
"sass-loader": "^6.0.5",
62-
"style-loader": "^0.17.0",
63-
"webpack": "^2.6.1",
64-
"webpack-dev-server": "^2.4.5"
60+
"react-test-renderer": "^15.6.1",
61+
"sass-loader": "^6.0.6",
62+
"style-loader": "^0.18.2",
63+
"webpack": "^3.5.4",
64+
"webpack-dev-server": "^2.7.1"
6565
},
6666
"peerDependencies": {
6767
"react": ">=0.14.0",
6868
"react-dom": ">=0.14.0"
6969
},
7070
"dependencies": {
71-
"babel-runtime": "^6.23.0",
71+
"babel-runtime": "^6.25.0",
7272
"classnames": "^2.2.5",
7373
"prop-types": "^15.5.10"
7474
},

postcss.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = {}

src/js/app.jsx

+9
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ class App extends React.Component {
2929
className="c-side-nav__list nav-list"
3030
style={ {fontWeight: 300} }
3131
offset={ -20 }
32+
onUpdate={
33+
() => {
34+
console.log(this)
35+
}
36+
}
3237
>
3338
<li className="c-side-nav__item"><a href="#section-1" className="c-side-nav__link">Getting Started</a></li>
3439
<li className="c-side-nav__item"><a href="#section-2" className="c-side-nav__link">Example</a></li>
@@ -136,6 +141,10 @@ class App extends React.Component {
136141
<td className="c-table__data">rootEl</td>
137142
<td className="c-table__data">Name of the element of scrollable container that can be used with <code>{'querySelector'}</code> [optional].</td>
138143
</tr>
144+
<tr>
145+
<td className="c-table__data">onUpdate</td>
146+
<td className="c-table__data">Function to be executed when the active item has been updated [optional].</td>
147+
</tr>
139148
</tbody>
140149
</table>
141150
</div>

src/js/lib/Scrollspy.jsx

+23
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@ import React from 'react'
33
import classNames from 'classnames'
44
import throttle from './throttle'
55

6+
function isEqualArray(a, b) {
7+
return (
8+
a.length === b.length
9+
&&
10+
a.every((item, index) => {
11+
return item === b[index]
12+
})
13+
)
14+
}
15+
616
export default class Scrollspy extends React.Component {
717

818
static get PropTypes () {
@@ -14,6 +24,7 @@ export default class Scrollspy extends React.Component {
1424
componentTag: PropTypes.string,
1525
offset: PropTypes.number,
1626
rootEl: PropTypes.string,
27+
onUpdate: PropTypes.func,
1728
}
1829
}
1930

@@ -24,6 +35,7 @@ export default class Scrollspy extends React.Component {
2435
style: {},
2536
componentTag: 'ul',
2637
offset: 0,
38+
onUpdate() {},
2739
}
2840
}
2941

@@ -178,13 +190,24 @@ export default class Scrollspy extends React.Component {
178190

179191
_spy (targets) {
180192
const elemensViewState = this._getElemsViewState(targets)
193+
const currentStatuses = this.state.inViewState
181194

182195
this.setState({
183196
inViewState: elemensViewState.viewStatusList,
184197
isScrolledPast: elemensViewState.scrolledPast
198+
}, () => {
199+
this._update(currentStatuses)
185200
})
186201
}
187202

203+
_update (prevStatuses) {
204+
if (isEqualArray(this.state.inViewState, prevStatuses)) {
205+
return
206+
}
207+
208+
this.props.onUpdate()
209+
}
210+
188211
_handleSpy () {
189212
throttle(this._spy(), 100)
190213
}

0 commit comments

Comments
 (0)