nextSlide = ({ target: { dataset: { step } } }) => {
this.setState(({ images: { length }, currentImageIndex: i }) => ({
currentImageIndex: Math.max(0, Math.min(length - this.props.slidesToShow, i + +step)),
}));
};
<button onClick={this.nextSlide} data-step="-1">PREV</button>
<button onClick={this.nextSlide} data-step="+2">NEXT</button>
<span>{{ result.prices[result.indexOfSize] }}</span>
items: [
{ size: '256GB', price: '99 999' },
{ size: '512GB', price: '105 999' },
],
index: 0,
<label v-for="(n, i) in result.items">
<input type="radio" :value="i" v-model.number="result.index">
<span>{{ n.size }}</span>
</label>
computed: {
selectedItem() {
return this.result.items[this.result.index];
},
...
<span>{{ selectedItem.price }}</span>
@click="menuShow=!menuShow,goToBlock"
@click="menuShow = !menuShow, goToBlock($event)"
. Ну а лучше бы конечно сделать новый метод (если goToBlock действительно нужен как отдельный метод, в противном случае достаточно унести в него переключение menuShow), как-то так:methods: {
goToBlock(selector) {
document.querySelector(selector).scrollIntoView({
behavior: 'smooth',
});
},
onMenuItemClick(e) {
this.menuShow = false;
this.goToBlock(e.target.getAttribute('href'));
},
},
@click.prevent="onMenuItemClick"
arr.splice(0, arr.length, ...arr.map((n, i, a) => (a[i - 1] ?? 0) + (a[i + 1] ?? 0)));
const $links = $('.small a');
let currentIndex = null;
function setActiveImage(index) {
currentIndex = (index + $links.length) % $links.length;
$('.big img').attr('src', $links.eq(currentIndex).attr('href'));
$('.photo').text(`${currentIndex + 1} / ${$links.length}`);
}
$links.click(e => (e.preventDefault(), setActiveImage($links.index(e.currentTarget))));
$('#prev').click(() => setActiveImage(currentIndex - 1));
$('#next').click(() => setActiveImage(currentIndex + 1));
setActiveImage(0);
computed: {
needWatch() {
return Object.fromEntries(Object.entries(this.obj_lev_1).map(n => [ n[0], n[1].need_watch ]));
},
},
watch: {
needWatch(newVal, oldVal) {
const [ k, v ] = Object.entries(newVal).find(n => n[1] !== oldVal[n[0]]);
alert(`${k}.need_watch changed from ${oldVal[k]} to ${v}`);
},
},
editTask (task, index) {
v-model="editidTask.title"
task.title = this.editTask.title
this.tasks.map((task, index) => { if (index === this.editidTask.id) {
<list
:tasks="task"
:key="task.title"
v-show="isModal"
null
.task.date = this.editTask.date task.title = this.editTask.title
Object.assign
. const select = document.querySelector('select');
const reg = /^\d\d\. /;
const mustBeHidden = el => !reg.test(el.text);
// или
const mustBeHidden = el => el.textContent.search(reg) !== 0;
// или
const mustBeHidden = el => el.innerText.match(reg) === null;
// или
const mustBeHidden = el => !~-el.innerHTML.split(reg).length;
const toggle = el => el.hidden = mustBeHidden(el);
// или
const toggle = el => el.style.display = mustBeHidden(el) ? 'none' : '';
// или
const toggle = el => el.style.setProperty('display', mustBeHidden(el) ? 'none' : '');
// или
const toggle = el => el.style.cssText += `display: ${mustBeHidden(el) ? 'none' : 'block'}`;
// или
const toggle = el => el.setAttribute('style', mustBeHidden(el) ? 'display: none' : '');
// или (надо будет добавить в стили .hidden { display: none; })
const toggle = el => el.classList.toggle('hidden', mustBeHidden(el));
Array.prototype.forEach.call(select.options, toggle);
// или
for (const n of select.children) {
toggle(n);
}
// или
for (let i = 0; i < select.length; i++) {
toggle(select[i]);
}
// или
(function next(i, n = select.item(i)) {
n && (toggle(n), next(-~i));
})(0);
// или
select.querySelectorAll('option').forEach(toggle);
const newData = data
.reduce((acc, { type, ...n }) => (
(acc[acc.length - 1]?.[0] !== type) && acc.push([ type, [] ]),
acc[acc.length - 1][1].push(n),
acc
), [])
.map(([ type, children ]) => children.length > 1
? { type: `Section${type}`, children }
: { type, ...children[0] }
);
const count = str => [...str]
.reduce((acc, n, i, a) => (
a[i - 1] !== n && acc.push([ n, 0 ]),
acc[acc.length - 1][1]++,
acc
), [])
.flat()
.join('');
const count = str => str.replace(/(.)\1*/g, m => m[0] + m.length);
new Date(str.split(' ', 1)[0].split('.').reverse().join('-')).toLocaleString('ru-RU', {
month: 'long',
day: 'numeric',
})
const $checkbox = $('.form__chekbox');
const $cbAll = $checkbox.filter('.form__chekbox_all');
const $cb = $checkbox.not($cbAll);
$cbAll.change(e => $cb.prop('checked', false));
$cb.change(() => {
const $checked = $cb.filter(':checked');
const allChecked = $checked.length === $cb.length;
$cbAll.prop('checked', !$checked.length || allChecked);
$cb.prop('checked', (i, val) => allChecked ? false : val);
});
function App(props) {
const [ items, setItems ] = React.useState([...props.items]);
const [ name, setName ] = React.useState('');
const add = () => setItems([
...items,
{
id: 1 + Math.max(0, ...items.map(n => n.id)),
name,
},
]);
return (
<div>
<div>
<input onChange={e => setName(e.target.value)} />
<button onClick={add}>add</button>
</div>
{items.map(n => (
<div key={n.id}>
{Object.entries(n).map(([ k, v ]) => <div>{k}: {v}</div>)}
</div>
))}
</div>
);
}
mounted() {
const observer = new IntersectionObserver(entries => {
if (entries[0].isIntersecting) {
stopObservation();
// здесь запрашивайте свои данные
}
}, {
threshold: 1,
});
observer.observe(this.$el);
const stopObservation = () => observer.disconnect();
this.$on('hook:beforeDestroy', stopObservation);
},
new Date instanceof Object // true
/(?=.*1)(?=.*2)(?=.*3)/.test(str)
[ 1, 2, 3 ].every(n => str.includes(n))
new Set(str.match(/[123]/g)).size === 3