• Оцените сайт. Что добавить, что улучшить?

    irishmann
    @irishmann
    Научись пользоваться дебаггером
    Адблок вырезает картинки

    5db147959fa2a421373993.jpeg
    5db1479b89112700659069.jpeg
    5db147a3bd045862686416.jpeg

    Очень сильно напрягает 0 в пиктограмме корзины

    5db1480c97721127054605.jpeg
    Ответ написан
    1 комментарий
  • Оцените сайт. Что добавить, что улучшить?

    SCINER
    @SCINER
    1. очень неудобно, то, что область клика на корзине в углу сайта ограничивается строго значком. надо сделать область раза в 3 шире
    2. в фильтре цветов я бы добавил кругляши покрашенные в соответствующий цвет
    3. зачем в фильтрах кнопки apply и remove если нельзя выбрать несколько значений одновременно
    4. цену привычнее и удобнее ограничивать по диапазону от и до
    5. цены незаметны на карточках
    Ответ написан
    Комментировать
  • Как более грамотно переписать подобный код?

    ms-dred
    @ms-dred
    Вечно что то не то и что то не так...
    Мне кажется эта конструкция лишняя на данном этапе по крайней мере
    if (player_chance > enemy_chance) {
    else if (enemy_chance > player_chance)

    Там разные переменные фигурируют, почему бы их последовательно не определить.
    И лишнее когда переменную переопределяете постоянно
    player_hp -= **
    Можно сделать что то вроде того (Примерно!)
    enemy_hp -= (p <= 10 && p > 7) && 40 || (p <= 7 && p > 5) && 20 || (p <= 5 && p > 0) && 10
    player_hp -= (e <= 10 && e > 7) && 40 || (e <= 7 && e > 5) && 20 || (e <= 5 && e > 0) && 10

    Ну и тут придется создать функции с цепочками действий, будет и понятно, и гибко

    Пока писал заметил что так будет даже лучше
    enemy_hp = hp(player_chance)
    player_hp = hp(enemy_chance)
    
    function hp(e) {
        return (e <= 10 && e > 7) && 40 || (e <= 7 && e > 5) && 20 || (e <= 5 && e > 0) && 10
    }

    Но и это еще улучшить можно
    Ответ написан
    Комментировать
  • Как более грамотно переписать подобный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дублируется логика вычисления урона здоровью от случайного балла, надо её в функцию:
    const hpDelta = chance => 10 + (chance > 5 ? 10 : 0) + (chance > 7 ? 20 : 0);


    spoiler
    const simpleFight = () => {
        let player_hp = 100;
        let enemy_hp = 100;
        let player_chance;
        let enemy_chance;
    
        const hpDelta = chance => 10 + (chance > 5 ? 10 : 0) + (chance > 7 ? 20 : 0);
        const randomChance = () => Math.floor(Math.random() * 11);
        const healthReport = hello => console.log(`${hello||''} Your health: ${player_hp}%, enemy health: ${enemy_hp}%`);
        const chanceReport = hello => console.log(`${hello||''} Your chance: ${player_chance}, enemy chance: ${enemy_chance}`);
    
        healthReport("Welcome!");
    
        while (player_hp || enemy_hp > 0) {
            player_chance = randomChance();
            enemy_chance = randomChance();
            chanceReport();
            if (player_chance > enemy_chance) {
                enemy_hp -= hpDelta(player_chance);
                console.log(`Your turn. Enemy health updated to: ${enemy_hp}%`);
            } else if (enemy_chance > player_chance) {
                player_hp = hpDelta(enemy_chance);
                console.log(`Enemy's turn. Your health updated to: ${player_hp}%`);
            } else {
                chanceReport('Equal chances!');
            }
    
            if (enemy_hp <= 0) {
                healthReport('You win!');
                break;
            } else if (player_hp <= 0) {
                healthReport('You lost!');
                break;
            }
        }
    }
    
    
    simpleFight();
    Ответ написан
    Комментировать
  • Как более грамотно переписать подобный код?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const attacks = [
      { minChance: 7, damage: 40, name: 'critical' },
      { minChance: 5, damage: 20, name: 'big' },
      { minChance: 0, damage: 10, name: 'weak' },
    ];
    
    const messages = {
      start: (player, enemy) => `Welcome! Yor health is - ${player}%, your enemy health - ${enemy}%`,
      end: (player, enemy) => `You ${enemy <= 0 ? 'win' : 'lost'}! Your hp level - ${player}, opponents hp level - ${enemy}`,
      chance: (player, enemy) => `your chance - ${player}, your opponent chance - ${enemy}`,
      turn: (player, enemy, hit, isEnemy) =>
    `${isEnemy ? 'Enemy' : 'Your'} turn...
    ${isEnemy ? 'Enemy' : 'You'} did a ${hit} hit
    ${isEnemy ? 'Your' : 'Enemy'} hp - ${isEnemy ? player : enemy}`,
    };
    
    
    const simpleFight = () => {
      const hp = [ 100, 100 ];
    
      console.log(messages.start(...hp));
    
      while (hp.every(n => n > 0)) {
        const chances = hp.map(() => Math.random() * 11 | 0);
    
        console.log(messages.chance(...chances));
    
        if (chances[0] !== chances[1]) {
          const chance = Math.max(...chances);
          const attack = attacks.find(n => n.minChance < chance);
          const isEnemyAttacks = chance === chances[1];
          hp[+!isEnemyAttacks] -= attack.damage;
    
          console.log(messages.turn(...hp, attack.name, isEnemyAttacks));
        }
      }
    
      console.log(messages.end(...hp));
    };
    Ответ написан
    1 комментарий
  • Как вызвать функцию при неактивной кнопке?

    hzzzzl
    @hzzzzl
    Ответ написан
    Комментировать
  • Почему не изменяется значение state-объекта?

    0xD34F
    @0xD34F Куратор тега React
    setState выполняет лишь поверхностное слияние, если вам требуется обновлять вложенные объекты - следует копировать все их свойства:

    this.setState({
      productToCart: {
        ...this.state.productToCart,
        color,
      },
    });
    Ответ написан
    1 комментарий
  • Почему не изменяется значение state-объекта?

    @lnked
    pickSize = size =>
      this.setState(prevState => ({
        productToCart: {
          ...prevState.productToCart,
          size,
        }
      }))
    
    pickColor = color =>
      this.setState(prevState => ({
        productToCart: {
          ...prevState.productToCart,
          color,
        }
      }))
    Ответ написан
    Комментировать
  • Как изменить элемент array на клик?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Можно просто менять состояние карточки:
    const ImageCard = ({ image, bio }) => {
      const [showBio, setShowBio] = useState(false);
      const handler = useCallback(() => {
        setShowBio(state => !state);
      }, []);
    
      return (
        <Wrapper>
          {showBio ? <Bio bio={bio} /> : <Image src={image} />}
          <Button onClick={hanlder}>Show bio</Button>;
        </Wrapper>
      );
    };
    Ответ написан
    1 комментарий
  • Как перенести функцию в Redux?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    handleChange и handleSubmit в редьюсере делать нечего. Оставьте эти хандлеры в компоненте.
    Ответ написан
    Комментировать
  • Что должен знать и уметь frontend разработчик в работе с REST Api?

    Xuxicheta
    @Xuxicheta
    инженер
    Брать данные с арi, отображать их, сортировать - это вроде ясно. Но этого ведь точно недостаточно.

    Конечно недостаточно, нужно еще уметь отправить данные :))
    Ну а если серьезно, ну что там еще? Websockets, GraphQL. Как правило гайды к фреймворкам содержат все необходимое.
    Ответ написан
    Комментировать
  • Почему не работает условие в JSX?

    @ivanoffdan
     Проблема в том, что displayColors не возвращает созданный массив. Надо так:
    displayColors = (colorSet) => {
        return colorSet.map((color, index) => (
          <li
            className={`filter-item ${this.state.color === color ? 'active-item' : null}`}
            key={index}
            onClick={() => this.handleFilter('color', color)}
          > {color} </li>
        ));
      }

    или так
    displayColors = (colorSet) => colorSet.map((color, index) => (
        <li
          className={`filter-item ${this.state.color === color ? 'active-item' : null}`}
          key={index}
          onClick={() => this.handleFilter('color', color)}
        > {color} </li>
      ))
    Ответ написан
    1 комментарий
  • В чём разница между способами создания компонентов?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    В чём разница между созданием компонентов, через: стрелочную функцию, классами из новых версийES и React.createClass.

    В классовых компонентах доступно состояние и методы жизненного цикла. В функциональных компонентах
    подобный функционал достигается использованием Hooks API.

    Метод React.createClass заменен внешним модулем create-react-class и используется в проектах в которых по каким-то причинам не используется ES6.

    А так же, чем лучше пользоваться?

    Использовать стрелочные функции и классы.
    Ответ написан
    3 комментария
  • Почему фильтр работает без связки с другими фильтрами?

    0xD34F
    @0xD34F Куратор тега React
    А почему вы фильтруете разные массивы? - в одном случае brasAll (это как раз тот, который "перебивает все прошлые фильтры"), а в остальных tempProducts.

    Почему метод,ответственный за фильтрацию, имеет в своём имени слово "sort"?

    Ну и длинно как-то всё, не помешало бы сократить, можно сделать массив фильтров, элементы которого будут состоять из двух значений - применяем/нет фильтр и собственно функция фильтрации, затем прогоняем через полученные фильтры массив с данными, как-то так:

    const filteredProducts = [
      [            true, n => n.type === 'Bras' ],
      [            true, n => n.price <= tempPrice ],
      [ color !== 'all', n => n.color === color ],
      [             cup, n => n.cup.includes(cup) ],
      [        shipping, n => n.freeShipping === true ],
      [          search, n => n.title.toLowerCase().startsWith(search.toLowerCase()) ],
    ].reduce((products, [ active, fn ]) => {
      return active
        ? products.filter(fn)
        : products;
    }, storeProducts);
    
    this.setState({ filteredProducts });
    Ответ написан
    Комментировать
  • Почему фильтр работает без связки с другими фильтрами?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Потому-что фильтруете исходный массив brasAll, а не результаты. Вообще, этот код:
    if (cup === "A") {
      tempProducts = brasAll.filter(item => item.cup.includes("A"))
    } else if (cup === "B") {
      tempProducts = brasAll.filter(item => item.cup.includes("B"))
    } else if (cup === "C") {
      tempProducts = brasAll.filter(item => item.cup.includes("C"))
    } else if (cup === "D") {
      tempProducts = brasAll.filter(item => item.cup.includes("D"))
    }

    Можно заменить на:
    if (cup) {
      tempProducts = tempProducts.filter(item => item.cup.includes(cup));
    }

    Я не вижу реального применения этому полотну кода. По-хорошему в реальных приложениях пишут так:
    handleSearch = () => {
      const { price, color, cup, shipping, search } = this.state;
      this.props.dispatch(fetchProducts({ price, color, cup, shipping, search });
    };

    Где fetchProducts это экшен иницирующий запрос на сервер вида:
    GET 'https://api.mysite.com/products?search=soes&price=120&color=red'
    Ответ написан
    1 комментарий
  • Как объединить несколько массивов в один и исключить повторы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вот окей, используем Set:

    Array.from(new Set(arr.flat()))
    
    // или, без создания промежуточного массива
    
    [...arr.reduce((acc, n) => (n.forEach(m => acc.add(m)), acc), new Set)]

    Вот не окей:

    Object.keys([].concat(...arr).reduce((acc, n) => (acc[n] = 1, acc), {}))
    
    // или
    
    Array.prototype.concat.apply([], arr).filter((n, i, a) => i === a.indexOf(n))
    
    // или
    
    `${arr}`.split(',').reduce((acc, n) => (acc.includes(n) || acc.push(n), acc), [])
    
    // или
    
    String(arr).match(/\w/g).sort().filter((n, i, a) => n !== a[i - 1])
    
    // или
    
    arr.toString().match(/(\w)(?!.*\1)/g) || []
    Ответ написан
    Комментировать
  • Как в JSX отобразить количество элементов функции map?

    @kova1ev
    const products = filteredProducts.filter(product => product.category === "Some, category").map (item => {
                              return (
                              <ProductCard 
                                key={item.id}
                                product = {item}
                              />)} )
    return (
      <div className="products-list">
                            <Title title="Some Title" />
                            <div className="products-container">
                              <p> {products.length} </p>
                            </div>
                            <div className="products-container">
                            {products}
                            </div>
                          </div>
    )
    Ответ написан
    3 комментария
  • Как в JSX отобразить количество элементов функции map?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы неправильно используете метод map. Он используется для преобразования данных, но никак не для фильтрации. Для фильтрации используют соответствующий метод filter:
    const someCategoryProducts =
      filteredProducts.filter(product => product.category === "Some, category");
    
    return (
      <div>
        <div>{someCategoryProducts.length}</div>
        <div>{someCategoryProducts.map(mapFn)}</div>
      <div>
    );
    Ответ написан
    Комментировать
  • Как в JSX отобразить количество элементов функции map?

    @LEXA_JA
    Длина нового массива, созданного map, будет всегда равна длине оригинального массива. Просто в тех случаях, где условие не выполняется, там будет на реактовский элемент, а false. Нужно сделать filter вместо map.
    const products = filteredProducts.filter(product => product.category === "Some, category");
    
    const count = products.length;
    
    return (
      <div className="products-list">
        <Title title="Some Title" />
        <div className="products-container">
            <p> {count} </p>
        </div>
        <div className="products-container">
          {products.map(product => (
              <ProductCard 
                 key={product.id}
                 product = {product}
               />
           ))}
         </div>
    </div>
    );
    Ответ написан
    1 комментарий
  • Как назначить false всем свойствам кроме одного?

    0xD34F
    @0xD34F Куратор тега React
    this.setState(state => Object
      .keys(state)
      .reduce((acc, n) => (acc[n] = n === 'свойствоКотороеДолжноБытьTrue', acc), {})
    );

    Только наверное все эти булевы свойства надо убрать в отдельный объект - у вас же скорее всего ещё что-то кроме них в стейте есть.

    Ну и ещё не очень понятен такой момент - а всегда ли true может быть только одно свойство? Если действительно всегда, тогда вам не нужно множество свойств, достаточно единственного, которое будет не булевым, а числом/строкой, содержащей в себе id/индекс/имя той сущности, которая в данный момент true.
    Ответ написан
    1 комментарий