summaryrefslogtreecommitdiff
path: root/preact/demo/context.js
blob: 3fe3bc0e2fb543f1c2a3cdf3bc5b0bbb213153f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// eslint-disable-next-line no-unused-vars
import { createElement, Component, createContext, Fragment } from 'preact';
const { Provider, Consumer } = createContext();

class ThemeProvider extends Component {
	state = {
		value: this.props.value
	};

	onClick = () => {
		this.setState(prev => ({
			value:
				prev.value === this.props.value ? this.props.next : this.props.value
		}));
	};

	render() {
		return (
			<div>
				<button onClick={this.onClick}>Toggle</button>
				<Provider value={this.state.value}>{this.props.children}</Provider>
			</div>
		);
	}
}

class Child extends Component {
	shouldComponentUpdate() {
		return false;
	}

	render() {
		return (
			<>
				<p>(blocked update)</p>
				{this.props.children}
			</>
		);
	}
}

export default class ContextDemo extends Component {
	render() {
		return (
			<ThemeProvider value="blue" next="red">
				<Child>
					<Consumer>
						{data => (
							<div>
								<p>
									current theme: <b>{data}</b>
								</p>
								<ThemeProvider value="black" next="white">
									<Consumer>
										{data => (
											<p>
												current sub theme: <b>{data}</b>
											</p>
										)}
									</Consumer>
								</ThemeProvider>
							</div>
						)}
					</Consumer>
				</Child>
			</ThemeProvider>
		);
	}
}