• Стоит ли использовать хуки вроде useState когда уже управляешь состоянием с помощью Redux?

    @karminski
    Senior React.JS Developer
    Если в двух словах, редукс для глобального состояния всего приложения (например, хранить данные таблиц), а хуки для состояния отдельных компонентов (типа табов). Но это не панацея. Лично у меня есть приложение, использующие только хуки для хранения состояния.
    Ответ написан
    5 комментариев
  • Стоит ли использовать хуки вроде useState когда уже управляешь состоянием с помощью Redux?

    @n1ksON
    мидл
    Не используйте props для пробрасывания dispatch и store из redux. Для этого, как вы верно подметили, есть useSelector и useDispatch.
    1. useState очень даже нужен несмотря на использование redux. К примеру, у вас на сайте отображается уведомление при клике на кнопку. Зачем статус отображения уведомления выносить в redux? Redux, как верно заметили, это как глобальный store. В этом нет надобности, для статуса отображения (true/false) достаточно использовать useState внутри компоненты.
    2. Не совсем корректно сформулировали вопрос.
    Если у вас функция используется только в конкретной компоненте - храните в ней.
    Если функция используется в нескольких компонентах одного уровня - вынесите функцию на уровень выше, куда эти компоненты импортируются.
    Если функция часто используется в разных местах - вынесите её в отдельный файл (utils) и импортируйте в нужные компоненты.
    Вопрос: Говнокод ли вот эта колбаса?

    Не понятно, что она решает. Возможно можно написать чуть красивее или вообще на регулярных выражениях. Главное, чтобы решало необходимую задачу
    Ответ написан
    Комментировать
  • Стоит ли идти джуном на удаленную работу? Или только релокейт?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    Если ты прошел техническое интервью, то будь уверен что там посмотрели не только то, что ты сейчас знаешь, но и твой потенциал. Если ты им подошел, значит они считают, что у тебя достаточно и знаний и характера чтобы освоить недостающее.
    Да, не факт что это будет легко, но не факт, что это будет очень сложно.
    Освоиться с подходом, гитом, общением по удаленке - обычный рабочий момент.

    А вообще, если на текущей работе куча свободного времени, то может еще и договориться остаться консультантом. Будет на новой работе работать, а на старой рефакторингом заниматься.
    Ответ написан
    Комментировать
  • Стоит ли идти джуном на удаленную работу? Или только релокейт?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Во всех нормальных компаниях есть вика, в которой описаны практически все процессы в компании. После вашего принятия hr вас ведёт примерно 2 недели. Вас практически сразу прикрепят к куратору. Куратор выдаст вам документ на 10-15 страниц. Там будут ссылки на курсы, подкасты , замечания по поводу использования. Примерно месяц вы будете с опухшей головой. В это время будете списываться с куратором 5-6 раз на дню. Скорее всего через 2 недели вас включат в реальный проект. Как правило вы оптимистично оцените сроки, и сделаете что то не так, будет ревью, поправите, потом втянетесь. Обязательно подпишитесь на общий чат и рассылки по тематике.
    Ответ написан
    5 комментариев
  • Стоит ли идти джуном на удаленную работу? Или только релокейт?

    verkhoturov
    @verkhoturov
    HTML-Верстальщик / Frontend Developer
    Если в команде нормально налажены процессы, без разницы где вы, в офисе или на удаленке.
    Если коллеги нормальные, без разницы где вы общаетесь, в чате или лично.
    Ответ написан
    5 комментариев
  • Алгоритм решения данной задачи?

    agoalofalife
    @agoalofalife
    Team Lead
    Понравилась задача, расскажу как сделал в итоге я.
    Программа работает слева -> направо, сверху -> вниз.
    Первый кусок, нам известен.
    Берем правую сторону первого элемента, находим его связь, далее для следующего элемента надо найти элемент противоположной стороны.
    Для примера правая сторона вот такая:
    `left: { edgeTypeId: 38, type: 'outside' }`
    Надо искать где edgeTypeId :38 и type:'inside'.
    Элемент который будет найден, надо обратить внимание, на его сторону, и получить противоположный.
    К примеру мы нашли 38 и inside, оно лежало в элементе с id:33, сторона: top, нам надо искать след элемент который будет в bottom, так как он противоположный.

    И так проходим всю строку до конца.
    Находим нижний элемент первого элемента первого ряда, и далее так же как и было выше, ищем связь для противоположной стороны.
    Прикреплю код, его можно сделать более читабельным, но решение рабочие для этой задачи.
    Осторожно код

    function solvePuzzle(pieces) {
    	// initial
    	let result = [pieces[0].id];
    	let next = {
    			edgeTypeId: pieces[0].edges.bottom.edgeTypeId,
    			type: pieces[0].edges.bottom.type,
    	};
    
    
    	for(let rowIndex = 0, step = -10;rowIndex < 10;rowIndex++, step += 10) {
    		if (rowIndex !== 0) {
    			next = getDownPiece(result[step], pieces)
    			result.push(next.id)
    			next = next.edges.bottom
    		}
    		for(let i = 0;i < 9;i++) {
    			next = findNextEdge(next, pieces, i === 8);
    			result.push(next.id)
    		}
       }
      return result;
    }
    
    
    function findNextEdge(previousEdge, pieces, isLast = false) {
    	let typeOpposite = getTypeOpposite(previousEdge.type);
    	let result = {};	
    	for (var i = 0; i < pieces.length; i++) {
    		let nextEdge = Object.entries(pieces[i].edges).find(function(edge) {
    			let [, nextEdgeCandidate] = edge
    			return nextEdgeCandidate !== null && previousEdge.edgeTypeId === nextEdgeCandidate.edgeTypeId && nextEdgeCandidate.type === typeOpposite;
    		});
    		if (nextEdge !== undefined) {
    			[typeSide] = nextEdge
    			if (isLast === false) {
    				result = Object.assign(pieces[i].edges[getOppositePosition(typeSide)], {id:pieces[i].id})
    			} else if(isLast){
    				result = Object.assign(pieces[i].edges[typeSide], {id:pieces[i].id})
    			}
    		}
    	}
    	return result;
    }
    
    function findConnectedEdge(leftEdge, pieces) {
    	let typeOpposite = getTypeOpposite(leftEdge.type);
    	return pieces.find(function(piece){
    		return Object.entries(piece.edges).find(function(edge) {
    			let [, rightEdgeCandidate] = edge
    			return rightEdgeCandidate !== null && leftEdge.edgeTypeId === rightEdgeCandidate.edgeTypeId && rightEdgeCandidate.type === typeOpposite;
    		});
    	});
    }
    
    function getTypeOpposite(type){
      return type === 'inside' ? 'outside':'inside';
    }
    function getOppositePosition(position) {
    	if (position === 'bottom') {
    		return 'top';
    	} else if(position === 'top') {
    		return 'bottom'
    	} else if (position === 'left') {
    		return 'right';
    	} else {
    		return 'left';
    	}
    }
    
    function getDownPiece(idUpPiece, pieces) {
    	return findConnectedEdge(pieces.find(edge => {
    	  return edge.id === idUpPiece;
    	}).edges.left, pieces)
    }
    
    // Не удаляйте эту строку
    window.solvePuzzle = solvePuzzle;

    Ответ написан
    Комментировать