data: () => ({
values: [ 0, 14235534, 53423, -9678953, 3451, 5323467445, -123456 ],
}),
filters: {
format1: val => `${val}`.replace(/\d(?=(\d{3})+$)/g, '$& '),
},
methods: {
format2: val => val.toLocaleString('ru-RU'),
},
computed: {
formatted() {
return this.values.map(n => {
const sign = Math.sign(n) === -1;
const arr = [...String(Math.abs(n))].reverse();
return (sign ? '-' : '') + Array.from(
{ length: Math.ceil(arr.length / 3) },
(n, i) => arr.slice(i * 3, (i + 1) * 3).reverse().join('')
).reverse().join(' ');
});
},
},
<div>
<div v-for="n in values">{{ n | format1 }}</div>
</div>
<div>
<div v-for="n in values">{{ format2(n) }}</div>
</div>
<pre>{{ formatted }}</pre>
мне кажется, это решение не очень хорошее из-за указания конкретного имени (phoneValues)
class App extends React.Component {
state = {
music: musicButton,
}
onClick = e => {
if (this.audio) {
this.audio.pause();
}
this.audio = new Audio(e.target.dataset.url);
this.audio.play();
}
render() {
return (
<div>
{this.state.music.map(n => (
<button onClick={this.onClick} data-url={n.url} key={n.numButton}>{n.soundsName}</button>
))}
</div>
);
}
}
v-model="answers[questionIndex]"
computed: {
answerSelected() {
return this.answers[this.questionIndex].length;
},
},
:disabled="!answerSelected"
А можете подсказать, как в результат вывести не только отмеченные поля, но на какой вопрос были эти поля отмечены?
saveItem = (id: string, modifiedItem: TCardItem) => {
function randomArr(size, min, max) {
const arr = Array.from({ length: max - min + 1 }, (n, i) => i + min);
for (let i = arr.length; --i > 0;) {
const j = Math.random() * (i + 1) | 0;
[ arr[j], arr[i] ] = [ arr[i], arr[j] ];
}
return arr.slice(0, size);
}
const arr = randomArr(4, 1, 9);
const containerSelector = '.dog';
const buttonSelector = 'i.fa-dog';
const counterSelector = '.score_counter';
$(buttonSelector).click(() => {
$(counterSelector).text((i, val) => +val + 1);
});
// или
document.querySelector(buttonSelector).addEventListener('click', () => {
document.querySelector(counterSelector).textContent -= -1;
});
.dog
несколько:$(containerSelector).on('click', buttonSelector, e => {
$(counterSelector, e.delegateTarget).text((i, val) => -~val);
});
// или
document.querySelectorAll(buttonSelector).forEach(function(n) {
n.addEventListener('click', this);
}, ({ currentTarget: t }) => t
.closest(containerSelector)
.querySelector(counterSelector)
.innerText++
);
const $thumbs = $('.thumbs');
$('.show-image').click(function(e) {
e.preventDefault();
$('.images img.active').removeClass('active');
$('.images img').eq(this.dataset.index).addClass('active');
}).attr('data-index', i => i);
$('.next').click(() => $thumbs.append($thumbs.find('.show-image').first()));
$('.prev').click(() => $thumbs.prepend($thumbs.find('.show-image').last()));
router-view
. Где он? Должен быть. Надо добавить..header
?) должна быть доступна везде - её можно вынести в компонент App (в котором следует разместить router-view
).router-link
вы в качестве id используете индекс? Вместо<router-link :to="{ name: 'detail', params: {id: index} }">
<router-link :to="{ name: 'detail', params: { id: post.id } }">
$route.params.id
, в котором выполнять запрос на получение данных поста. Выглядеть это может как-то так:data: () => ({
post: null,
}),
watch: {
'$route.params.id': {
immediate: true,
handler(id) {
axios.get(`https://jsonplaceholder.typicode.com/posts/${id}`).then(r => this.post = r.data);
},
},
},
<button>toggle disabled</button>
<select>
<option value="">выбрать</option>
<option value="69">hello, world!!</option>
<option value="187">fuck the world</option>
<option value="666">fuck everything</option>
</select>
const $select = $('select');
$('button').click(function() {
$select
.prop('disabled', (i, val) => !val)
.val('')
.find('[value=""]')
.text(() => $select.prop('disabled') ? 'тут ничего нет' : 'выбрать');
});
// или
const select = document.querySelector('select');
document.querySelector('button').addEventListener('click', () => {
select.disabled = !select.disabled;
select.value = '';
select[0].textContent = select.disabled ? 'тут ничего нет' : 'выбрать';
});
@scroll="onScroll"
methods: {
onScroll(e) {
if (e.target.offsetHeight + e.target.scrollTop >= e.target.scrollHeight) {
// ...
}
},
e.target.scrollHeight - расстояниеДоНижнейГраницы
).const elems = document.querySelectorAll('.hint');
// или
const elems = document.getElementsByClassName('hint');
const getText = el => el.innerText;
// или
const getText = el => el.textContent;
// или
const getText = el => el.firstChild.nodeValue;
const hints = Array.from(elems, getText);
// или
const hints = Array.prototype.map.call(elems, getText);
// или
const hints = [];
for (const n of elems) {
hints.push(getText(n));
}
// или
const hints = [];
for (let i = 0; i < elems.length; i++) {
hints[i] = getText(elems[i]);
}
const filterSelector = '.s-mobile-filter-type-select';
const selectSelector = '.s-mobile-filter-type-select__select';
const selectedSelector = '.s-mobile-filter-type-select__selected-options-list-content';
$(selectSelector).on('change', function() {
$(this)
.closest(filterSelector)
.find(selectedSelector)
.text($('option:selected', this).get().map(n => $(n).text()).join(', '));
});
const updateSelected = select => select
.closest(filterSelector)
.querySelector(selectedSelector)
.textContent = Array
.from(select.selectedOptions, n => n.text)
.join(', ');
// можно назначить обработчик события каждому select'у индивидуально
document.querySelectorAll(selectSelector).forEach(function(n) {
n.addEventListener('change', this);
}, e => updateSelected(e.target));
// или, применяем делегирование
document.addEventListener('change', ({ target: t }) => {
if (t.matches(selectSelector)) {
updateSelected(t);
}
});
const uniqueWithSum = (arr, idKey, sumKey) =>
Object.values(arr.reduce((acc, n) => {
const id = n[idKey];
acc[id] = acc[id] || Object.assign(new n.constructor, n, { [sumKey]: 0 });
acc[id][sumKey] += n[sumKey];
return acc;
}, {}));
// ваш случай
const result = uniqueWithSum(arr, 'id', 'duration');
// элементам не обязательно быть объектами, это могут быть и массивы
uniqueWithSum([
[ 'A', 1 ],
[ 'B', 5 ],
[ 'A', 2 ],
[ 'A', 3 ],
], 0, 1) // [ [ 'A', 6 ], [ 'B', 5 ] ]