React Typescript-Math.randomは、最小値と最大値が設定されていても間違った結果を返します

クッキーモンスター

メインTSXファイル

  const [minNumber, setMinNumber] = useLocalStorage('minRange', 1);
  const [maxNumber, setMaxNumber] = useLocalStorage('maxRange', 10);

..。

  const getRandomNumber = () => {
    //Return a random number between minNumber and maxNumber:
    console.log("min: " + minNumber + " max: " + maxNumber)
    let randomNr = Math.floor(Math.random() * (maxNumber - minNumber + 1) + minNumber);
    setRandomNumber(randomNr);
  }

ローカルストレージフック:

import { useState } from 'react';

export function useLocalStorage(key, defaultValue) {
    const getInitialValue = () => localStorage.getItem(key) ?? defaultValue;
    const [value, setValue] = useState(getInitialValue);
    const setAndStoreValue = (newValue) => {
        if (newValue !== '') {
            setValue(newValue);
            localStorage.setItem(key, newValue)
        }
    }
    return [value, setAndStoreValue];
};

問題を実証するため。コードサンドボックスリンクを作成しました:https://codesandbox.io/s/hdwqy?file = / src / App.tsx

問題を再現する方法:

  • デフォルトでは、minValueは1、maxValueは10です。
  • minValueを8およびmaxValue9に設定します(codesandboxの[Change min&max value]ボタンをクリックします)
  • getRandomNumber()関数を実行します。Outputs: 8 or 9-動作します!(codesandboxの[新しい乱数]ボタンをクリックします)
  • ページを更新すると、ローカルストレージに保存されているデータが最小= 8、最大= 9になります。
  • getRandomNumber()関数を実行します。outputs 0 or 1-間違った出力!(codesandboxの[新しい乱数]ボタンをクリックします)
  • 問題は、minとmaxの差が2であるため、0と1になります。minが8でmaxが10の場合、0、1、または2が出力されます。

最小値と最大値を再度設定してランダム関数を再実行すると正常に機能するため、なぜこれが発生しているのか理解できないようです。どちらの場合もconsole.logが出力されることにも言及したいと思いますmin: 8 max: 9。したがって、ローカルストレージが値を正しくロードしているようです。それはかなり奇妙です。

特定のパフォーマンス

問題はこれに減らすことができます:

const minNumber = '8';
const maxNumber = '9';
const getRandomNumber = () => {
  console.log("min: " + minNumber + " max: " + maxNumber);
  console.log('part', maxNumber - minNumber + 1);
  const result = Math.random() * 2 + '8';
  console.log(result);
};

getRandomNumber();

ローカルストレージの値は常に文字列です。この:

let randomNr = Math.floor(
  Math.random() * (maxNumber - minNumber + 1) + minNumber
);

になり、8と9で:

let randomNr = Math.floor(
  Math.random() * 2 + '8'
);

0.234458またはのようなものに変わります1.63138-+末尾の8を小数部分に連結Math.floorし、それを削り取ります。そのため、0または1のいずれかの数値が残ります。

おそらく次のマッパー関数を使用して、ストレージ値を最初に数値にキャストしますuseLocalStorage

export function useLocalStorage(key, defaultValue, mapper = str => str) {
    const getInitialValue = () => localStorage.getItem(key) !== null
      ? mapper(localStorage.getItem(key))
      : defaultValue;
    const [value, setValue] = useState(getInitialValue);
    const setAndStoreValue = (newValue) => {
        if (newValue !== '') {
            setValue(newValue);
            localStorage.setItem(key, newValue)
        }
    }
    return [value, setAndStoreValue];
};
const [minNumber, setMinNumber] = useLocalStorage('minRange', 1, Number);
const [maxNumber, setMaxNumber] = useLocalStorage('maxRange', 10, Number);

この問題は、(回避より多くの活字体を利用することによって回避し、適切にあなたの変数を入力されている可能性がany-活字のポイントを敗北) -の種類minNumbermaxNumberされ、文字列や数値だけではなく数はあなたを傾けていました。

ジェネリックも使用します。

function useLocalStorage<T>(
  key: string,
  defaultValue: T,
  mapperToValue: (lsValue: string) => T,
  mapperToLS: (value: T) => string
) {
  const getInitialValue = () => {
    const lsValue = localStorage.getItem(key);
    return lsValue !== null ? mapperToValue(lsValue) : defaultValue;
  };
  const [value, setValue] = useState(getInitialValue);
  const setAndStoreValue = (newValue: T) => {
    setValue(newValue);
    localStorage.setItem(key, mapperToLS(newValue));
  };
  return [value, setAndStoreValue] as const;
}

export default function App() {
  const [minNumber, setMinNumber] = useLocalStorage("minRange", 1, Number, String);
  const [maxNumber, setMaxNumber] = useLocalStorage("maxRange", 10, Number, String);
  const [rndNumber, setRndNumber] = useState(0);
  // ...

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

間違った小道具を持つReact機能コンポーネント(React.FC <Props>)が小道具として送信されても、Typescriptは文句を言いませんか?

分類Dev

React TypeScript:useRefを使用して入力の初期値を設定します

分類Dev

Python math.arctan()の結果が間違っていますか?

分類Dev

Math.random()-最小値から最大値の範囲を設定します

分類Dev

Javascript-Math.random関数は、forループで呼び出されても同じ結果を返します

分類Dev

Math.cos()は間違った結果を出します

分類Dev

Math.powは間違った結果を出します

分類Dev

Math.log()はc#で間違った値を与えています

分類Dev

Typescriptは、小道具がナビゲーションHOCを使用したreact-navigationによって提供されることを理解していません

分類Dev

React Typescript、React JavaScript、React Nativeの違いは?

分類Dev

reactとtypescriptを使用して未定義の値を具体的にチェックしないのに、条件がfalseと評価されないのはなぜですか?

分類Dev

reactとtypescriptを使用して未定義の値を具体的にチェックしないのに、条件がfalseと評価されないのはなぜですか?

分類Dev

Typescriptとreact-router

分類Dev

JavascriptでMath.min.apply()を使用して配列の最小値を取得すると、NaNが返されますか?

分類Dev

.ts拡張子と.tsx拡張子の違いは何ですか。どちらもreactでtypescriptファイルの拡張子として使用されます。では、どこでそれらを使用する必要がありますか?

分類Dev

python3:math.cos()が間違った値を返す

分類Dev

React Nativeは、誤って定義されたタイプで引き続き実行されます(TypeScript)

分類Dev

Apache Commons Math:三重対角行列の固有分解は間違った結果をもたらします

分類Dev

Typescript Reactフックを使用すると、間違ったタイプのコンテキストプロパティを設定できます

分類Dev

コンポーネントから返された値を、reactとtypescriptを使用してコンポーネントに小道具として渡すのではなく、コンポーネントでuseHookを使用するにはどうすればよいですか?

分類Dev

3つのMath.random()値を生成して連結することは、1つのMath.random()値よりもランダムですか?

分類Dev

Math.sin()は正確な結果を提供しません[正しい値を渡すためにMath.toRadiansを使用しています]

分類Dev

TypescriptをReactする方法setState

分類Dev

TypeScript + React <-小道具を渡す

分類Dev

Lua: `math.random`から生成された値は使用されていません

分類Dev

TypeScriptとReactの問題

分類Dev

React + TypeScriptで状態を設定する

分類Dev

Reactをmath.jsライブラリと連携させる

分類Dev

React-Typescriptは動的な値を兄弟に渡しますか?

Related 関連記事

  1. 1

    間違った小道具を持つReact機能コンポーネント(React.FC <Props>)が小道具として送信されても、Typescriptは文句を言いませんか?

  2. 2

    React TypeScript:useRefを使用して入力の初期値を設定します

  3. 3

    Python math.arctan()の結果が間違っていますか?

  4. 4

    Math.random()-最小値から最大値の範囲を設定します

  5. 5

    Javascript-Math.random関数は、forループで呼び出されても同じ結果を返します

  6. 6

    Math.cos()は間違った結果を出します

  7. 7

    Math.powは間違った結果を出します

  8. 8

    Math.log()はc#で間違った値を与えています

  9. 9

    Typescriptは、小道具がナビゲーションHOCを使用したreact-navigationによって提供されることを理解していません

  10. 10

    React Typescript、React JavaScript、React Nativeの違いは?

  11. 11

    reactとtypescriptを使用して未定義の値を具体的にチェックしないのに、条件がfalseと評価されないのはなぜですか?

  12. 12

    reactとtypescriptを使用して未定義の値を具体的にチェックしないのに、条件がfalseと評価されないのはなぜですか?

  13. 13

    Typescriptとreact-router

  14. 14

    JavascriptでMath.min.apply()を使用して配列の最小値を取得すると、NaNが返されますか?

  15. 15

    .ts拡張子と.tsx拡張子の違いは何ですか。どちらもreactでtypescriptファイルの拡張子として使用されます。では、どこでそれらを使用する必要がありますか?

  16. 16

    python3:math.cos()が間違った値を返す

  17. 17

    React Nativeは、誤って定義されたタイプで引き続き実行されます(TypeScript)

  18. 18

    Apache Commons Math:三重対角行列の固有分解は間違った結果をもたらします

  19. 19

    Typescript Reactフックを使用すると、間違ったタイプのコンテキストプロパティを設定できます

  20. 20

    コンポーネントから返された値を、reactとtypescriptを使用してコンポーネントに小道具として渡すのではなく、コンポーネントでuseHookを使用するにはどうすればよいですか?

  21. 21

    3つのMath.random()値を生成して連結することは、1つのMath.random()値よりもランダムですか?

  22. 22

    Math.sin()は正確な結果を提供しません[正しい値を渡すためにMath.toRadiansを使用しています]

  23. 23

    TypescriptをReactする方法setState

  24. 24

    TypeScript + React <-小道具を渡す

  25. 25

    Lua: `math.random`から生成された値は使用されていません

  26. 26

    TypeScriptとReactの問題

  27. 27

    React + TypeScriptで状態を設定する

  28. 28

    Reactをmath.jsライブラリと連携させる

  29. 29

    React-Typescriptは動的な値を兄弟に渡しますか?

ホットタグ

アーカイブ