data: () => ({
items: [
{ buttonTitle: '...', blockClass: '...' },
{ buttonTitle: '...', blockClass: '...' },
...
],
active: null,
}),
<button
v-for="n in items"
:class="{ active: active === n }"
@click="active = n"
>{{ n.buttonTitle }}</button>
<div v-if="active" :class="[ 'block', active.blockClass ]">
изменяя что-то в одном компоненте, меняется во всех
$k = array_keys($arr);
$v = array_values($arr);
sort($k);
sort($v);
$arr = array_combine($k, $v);
const items = [
{ id: ..., title: '...', img: '...' },
{ id: ..., title: '...', img: '...' },
...
];
function Slider({ items }) {
const [ active, setActive ] = React.useState(0);
const { length, [active]: slide } = items;
const next = e => setActive((active + +e.target.dataset.step + length) % length);
const goTo = e => setActive(+e.target.dataset.index);
return (
<div>
<div className="slideshow-container">
<div className="mySlides fade">
<div className="numbertext">{active + 1} / {length}</div>
<img src={slide.img} />
<div className="text">{slide.title}</div>
</div>
<a className="prev" onClick={next} data-step={-1}>❮</a>
<a className="next" onClick={next} data-step={+1}>❯</a>
</div>
<div className="dots">
{items.map((n, i) => (
<span
key={n.id}
className={`dot ${i === active ? 'active' : ''}`}
onClick={goTo}
data-index={i}
></span>
))}
</div>
</div>
);
}
animation-delay
. Или поверните .container
через transform: rotate
. function App() {
const [ count, setCount ] = useState(3);
const updateCount = ({ target: { dataset: { change } } }) =>
setCount(Math.max(0, count + +change));
const refs = useRef([]);
const logRefs = () => console.log(refs.current);
useEffect(() => {
refs.current.length = count;
}, [ count ]);
return (
<div>
<button onClick={updateCount} data-change={-1}>-</button>
{count}
<button onClick={updateCount} data-change={+1}>+</button>
<button onClick={logRefs}>log refs</button>
{Array.from({ length: count }, (n, i) => (
<div ref={el => refs.current[i] = el}>
{Math.random() * 1000 | 0}
</div>
))}
</div>
);
}
<label v-for="f in filters">
<input type="checkbox" v-model="f.checked">
{{ f.name }}
</label>
computed: {
filteredFood() {
const filters = this.filters.filter(n => n.checked).map(n => n.code);
return this.meatFood.filter(n => filters.some(f => n[f]));
},
},
При клике на элемент - я сохраняю текущий элемент в store vuex и перехожу по роуту...
Object.values(arr.reduce((acc, n) => {
const date = n.date.split(' ', 1)[0];
(acc[0][date] = acc[0][date] || { id: ++acc[1], date, docs: [] }).docs.push(n);
return acc;
}, [ {}, 0 ])[0])
[...arr.reduce((acc, n) => {
const [ date ] = n.date.match(/\S+/);
acc.set(date, acc.get(date) || { id: -~acc.size, date, docs: [] }).get(date).docs.push(n);
return acc;
}, new Map).values()]
item.object
вместо listItem.object
.let show = 1;
function sh() {
const [ display, text ] = [ [ 'none', 'Развернуть' ], [ 'block', 'Свернуть' ] ][show ^= 1];
[...document.querySelectorAll('.list-row')].slice(3).forEach(n => n.style.display = display);
document.querySelector('#button').textContent = text;
}
window.addEventListener('load', sh);
function walk(node) {
if (node) {
console.log(node);
walk(node.next);
}
}
function walk(node) {
while (node) {
console.log(node);
node = node.next;
}
}
.tags li.hidden {
display: none;
}
document.querySelectorAll('.tags b').forEach(n => {
n.closest('li').classList.add('xxx');
n.addEventListener('click', onClick);
});
function onClick(e) {
for (
let el = e.target.closest('li');
(el = el.nextElementSibling) && !el.classList.contains('xxx');
el.classList.toggle('hidden')
) ;
}