Skip to content

Instantly share code, notes, and snippets.

View jonathanharrell's full-sized avatar

Jonathan Harrell jonathanharrell

View GitHub Profile
@jonathanharrell
jonathanharrell / accordion-panel.js
Created September 25, 2018 17:14
AccordionPanel Component Using Provide/Inject
Vue.component('accordion-panel', {
inject: ['accordionItemState'],
template: `
<div class="accordion-panel" :class="{ expanded: accordionItemState.expanded }">
<slot></slot>
</div>
`
})
@jonathanharrell
jonathanharrell / accordion-header.js
Created September 25, 2018 17:14
AccordionHeader Component Using Provide/Inject
Vue.component('accordion-header', {
inject: ['accordionItemState'],
template: `
<h2 class="accordion-header">
<button @click="accordionItemState.expanded = !accordionItemState.expanded">
{{ accordionItemState.expanded ? '▼' : '►' }}
<slot></slot>
</button>
</h2>
@jonathanharrell
jonathanharrell / accordion-item.js
Created September 25, 2018 17:13
AccordionItem Component Using Provide/Inject
Vue.component('accordion-item', {
data () {
return {
sharedState: {
expanded: false
}
}
},
provide () {
@jonathanharrell
jonathanharrell / accordion-panel.js
Created September 25, 2018 17:11
AccordionPanel Component Using Context
const AccordionPanel = (props) => {
return (
<AccordionItemContext.Consumer>
{({ expanded }) => <div className={"accordion-panel " + (expanded ? 'expanded' : '')}>{props.children}</div>}
</AccordionItemContext.Consumer>
)
}
@jonathanharrell
jonathanharrell / accordion-header.js
Created September 25, 2018 15:37
Accordion Header Component Using Context
const AccordionHeader = (props) => {
return (
<AccordionItemContext.Consumer>
{({ expanded, toggleExpansion }) => (
<h2 className="accordion-header">
<button onClick={toggleExpansion}>
{ expanded ? '▼ ' : '► ' }
{ props.children }
</button>
</h2>
@jonathanharrell
jonathanharrell / accordion-item.js
Last active September 25, 2018 15:36
Accordion Item Component Using Context
class AccordionItem extends React.Component {
constructor (props) {
super(props)
this.toggleExpansion = () => {
this.setState({ expanded: !this.state.expanded })
}
this.state = {
expanded: false,
@jonathanharrell
jonathanharrell / accordion-item.js
Created September 25, 2018 15:34
Accordion Item Context
const AccordionItemContext = React.createContext({
expanded: false,
toggleExpansion: () => {}
});
@jonathanharrell
jonathanharrell / accordion.js
Created September 25, 2018 15:32
Accordion Component with Render Props
<Accordion>
<AccordionItem render={({expanded}) => (
<AccordionHeader expanded={expanded}>
Header content
</AccordionHeader>
<AccordionPanel expanded={expanded}>
Panel content
</AccordionPanel>
)}
/>
@jonathanharrell
jonathanharrell / accordion.js
Last active September 25, 2018 15:32
Ideal Accordion Component API
<Accordion>
<AccordionItem>
<AccordionHeader>Header content</AccordionHeader>
<AccordionPanel>Panel content</AccordionPanel>
</AccordionItem>
</Accordion>
@jonathanharrell
jonathanharrell / app.js
Last active July 7, 2018 20:32
Using ObserveDimensions React Component With Render Props
class App extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<div className="wrapper">
<ObserveDimensions
render={({width, height}) => (