├── .gitignore
├── LICENSE
├── README.md
├── index.js
├── main.js
├── package.json
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (http://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 |
39 | # Typescript v1 declaration files
40 | typings/
41 |
42 | # Optional npm cache directory
43 | .npm
44 |
45 | # Optional eslint cache
46 | .eslintcache
47 |
48 | # Optional REPL history
49 | .node_repl_history
50 |
51 | # Output of 'npm pack'
52 | *.tgz
53 |
54 | # Yarn Integrity file
55 | .yarn-integrity
56 |
57 | # dotenv environment variables file
58 | .env
59 |
60 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Michael Chan
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # setstate
2 | Set local state in a React.Component
3 |
4 | [setstate on github](https://github.com/learnreact/setstate)
5 |
6 | ## Installation
7 | ```js
8 | yarn add react setstate
9 | ```
10 |
11 | ## Example
12 | setState keeps local state on an instance of `React.Component` or `React.PureComponent`.
13 |
14 | In practice, it looks like so:
15 |
16 | ```js
17 | import React from "react";
18 | import setState from "setstate";
19 |
20 | class Counter extends React.Component {
21 | constructor() {
22 | super();
23 | this.state = { count: 0 };
24 | }
25 |
26 | render() {
27 | return (
28 |
29 |
{this.state.count}
30 |
31 |
35 |
36 |
40 |
41 | );
42 | }
43 | }
44 |
45 | ```
46 |
47 | ## Use in Create React App
48 | `create-react-app` ships with [`transform-class-properties`](https://babeljs.io/docs/plugins/transform-class-properties/) installed.
49 |
50 | This can make working with local state faster and less ceremonious.
51 |
52 | ```js
53 | class Counter extends React.Component {
54 | // don't mess with the constructor to initialize state.
55 |
56 | state = { count: 0 }
57 |
58 | // create instance methods for better perf and re-use.
59 |
60 | increment = () => this.setState(({ count }) => ({ count: count + 1 }))
61 | decrement = () => this.setState(({ count }) => ({ count: count - 1 }))
62 |
63 | // the clean code you've always dreamed of.
64 |
65 | render() {
66 | return (
67 |
68 |
{this.state.count}
69 |
70 |
71 |
72 |
73 | );
74 | }
75 | }
76 | ```
77 |
78 | ## API
79 | `setstate` ships with 2 APIs.
80 | I know that sounds complicated but it's not.
81 |
82 | ### Object form
83 | This is best used when setting a new value or blowing away a previous value:
84 |
85 | ```js
86 | this.setState({ name: "Michael" })
87 | ```
88 |
89 | Here's what it looks like in response to an input's change event.
90 |
91 | ```js
92 | // this.state.name gets replaced for every onChange
93 | this.setState({ name: target.value })}
97 | />
98 | ```
99 |
100 | ### Function form
101 | This is best used when transitioning existing state (like the counter above).
102 |
103 | ```js
104 | this.setState(previousState => ({ count: previousState.count + 1 }));
105 | ```
106 |
107 | This is what it looks like in response to a button press:
108 |
109 | ```js
110 |