export function declOfNum(num, titles) {
const cases = [2, 0, 1, 1, 1, 2];
return titles[(num % 100 > 4 && num % 100 < 20)
? 2
: cases[(num % 10 < 5) ? num % 10 : 5]
];
}
declOfNum(3, ['день', 'дня', 'дней']) // дня
$_POST; // название поля: значение.
foreach($_POST as $field => $value) {
echo $field; // название поля
echo $value; // значение
}
ssh <host> "mysqldump -uroot -p base" > base.sql
mysql -uroot -p base < base.sql
const xArray = [-1, 0, 1, 2, 3, 4, 5, 11];
let xArray2 = xArray.filter((x) => {
return 0 <= x && x <= 10;
});
xArray2; // [0, 1, 2, 3, 4, 5]
App\Http\Controllers
namespace App\Http\Controllers\Stuff_doctor
react-router-redux
я не работал, но похоже вот на что:navigationActions
, который в свою очередь вызывает редюсер, то в итоге получаете новый state, а т.к. другие ваши компоненты используют state, то для них этот state тоже новый, и происходит ререндер, чтобы не происходило лишних ререндеров, вам поможет метод shouldComponentUpdate или PureComponent <a @click="showModal = true">открыть форму</a>
<Modal v-if="showModal" @close="showModal = false">
<MySuperForm @success="handleSubmit" />
</Modal>
this.$parent.$on(...)
this.$children.$on(...)
<input onchange="handleChange" type="file" />
<!-- как-то циклом выводи Store.files -->
<span>file 1</span>
<button onclick="(e) => removeFile(0)">remove file</button>
<span>file 2</span>
<button onclick="(e) => removeFile(1)">remove file</button>
const Store = {
files: [], // какое-то хранищие файлов, для примера так
}
// при выборе файлов, мы будем их добавлять
function handleChange(e) {
// если не выбрали файл и нажали отмену, то ничего не делать
if (!e.target.files.length) {
return;
}
// создаем новый массив с нашими файлами
const files = Object.keys(e.target.files).map((i) => e.target.files[i]);
addFiles(files); добавляем файлы в хранилище
// очищаем input, т.к. файл мы сохранили
e.target.value = '';
}
function addFiles(files) {
// добавляем файлы в общую кучу
Store.files = Store.files.concat(files);
}
// удалить файл из хранилища, например по индексу в массиве
function removeFile(index) {
// удаляем файл по индексу
Store.files.splice(index, 1);
}
// если надо послать файлы на сервер, формируем FormData с файлами
// const formData = getFilesFormData(Store.files);
function getFilesFormData(files) {
const formData = new FormData();
files.map((file, index) => {
formData.append(`file${index + 1}`, file);
});
return formData;
}
data[2].children[3].name // child folder
<input type="checkbox" :value="model.checked" @input="handleChecked(path, !model.checked)">
// methods of component
function handleChecked(path, checked) {
// вызываем экшен сторы и передаем путь и checked флаг
this.$store.dispatch('checked', {path: path, checked: checked })
}
// Store
{
actions: {
checked: function(store, payload) {
store.commit('updateChecked', payload)
}
},
mutations: {
updateChecked: function(state, payload) {
_.update(state.data, payload.path, function(node) {
node.checked = payload.checked;
return node;
});
state.data = state.data.concat([]); // создать НОВЫЙ массив, чтобы запустить ререндер
}
}
}
<template>
<div>
<textarea v-model="comment"></textarea>
<button :disabled="!comment">send</button>
</div>
</template>
<script>
export default {
name: 'my-component',
data() {
return {
comment: ''
}
}
}
</script>