Reactで関数が2回呼び出されるのはなぜですか?

テイラーオースティン:

これは、ラジオボタンを変更するためにいくつかのスタイリングを行っているためと考えられますが、よくわかりません。関数を2回呼び出すonClickイベントを設定しています。他の場所でトリガーされていないことを確認するために削除しましたが、onClickが原因のようです。

<div
  className="CheckboxContainer"
  onClick={() =>
    this.changeShipping({ [k]: i })
  }
>
  <label>
    <div className="ShippingName">
      {shipOption.carrier
        ? shipOption.carrier.serviceType
        : null}{' '}
      {shipOption.name}
    </div>
    <div className="ShippingPrice">
      ${shipOption.amount}
    </div>
    <input
      type="radio"
      value={i}
      className="ShippingInput"
      onChange={() =>
        this.setState({
          shippingOption: {
            ...this.state.shippingOption,
            [k]: i
          }
        })
      }
      checked={
        this.state.shippingOption[k] === i
          ? true
          : false
      }
    />
    <span className="Checkbox" />
  </label>
</div>

私の機能は、今のところ、配送オプションの単純なコンソールログです。

changeShipping(shipOption){
 console.log('clicked') // happening twice 
}

これが発生する理由がここに表示されている理由がない場合は、コードの残りの部分を投稿できますが、たくさんあり、これは関係ないと思いますが、これは良い出発点だと思います。

完全なコード:

import React, { Component } from 'react'
import fetch from 'isomorphic-fetch'
import { Subscribe } from 'statable'
import { FoldingCube } from 'better-react-spinkit'

import styles from './styles'
import { cost, cartState, userInfo, itemState, Api } from '../../state'
import { removeCookies, resetCart } from '../../../injectState'

export default class ShippingOptions extends Component {
  constructor(props) {
    super(props)
    this.state = {
      shippingOption: {}
    }

    this.changeShipping = this.changeShipping.bind(this)
  }

  async changeShipping(shipOption) {
    const shipKey = Object.keys(shipOption)[0]
    // if (userInfo.state.preOrderInfo.setShip[shipKey] === shipOption[shipKey]) {
    //   return
    // }
    let updatedShipOption = {}
    Object.keys(shipOption).forEach(k => {
      updatedShipOption = userInfo.state.preOrderInfo.setShip
        ? { ...userInfo.state.preOrderInfo.setShip, [k]: shipOption[k] }
        : shipOption
    })

    userInfo.setState({
      preOrderInfo: {
        ...userInfo.state.preOrderInfo,
        setShip: updatedShipOption
      }
    })

    // Make request to change shipping option
    const { preOrderInfo } = userInfo.state

    const shippingRes = await fetch(Api.state.api, {
      body: JSON.stringify(preOrderInfo),
      method: 'POST'
    })
      .then(res => res.json())
      .catch(err => {
        let error = ''
        if (
          err.request &&
          (err.request.status === 404 || err.request.status === 502)
        ) {
          error = `Error with API: ${err.response.statusText}`
        } else if (err.request && err.request.status === 0 && !err.response) {
          error =
            'Something went wrong with the request, no response was given.'
        } else {
          error = err.response || JSON.stringify(err) || err
        }
        cartState.setState({
          apiErrors: [error],
          loading: false
        })
      })
    console.log(shippingRes)
  }

  async componentDidMount() {
    if (cartState.state.tab === 2) {
      const { shipping } = userInfo.state
      const { items, coupon } = itemState.state
      let updated = { ...shipping }
      const names = updated.shippingFullName.split(' ')
      updated.shippingFirst = names[0]
      updated.shippingLast = names[1]
      delete updated.shippingFullName
      updated.site = cartState.state.site
      updated.products = items
      updated.couponCode = coupon
      updated.addressSame = userInfo.state.addressSame
      cartState.setState({
        loading: true
      })
      const shippingRes = await fetch(Api.state.api, {
        body: JSON.stringify(updated),
        method: 'POST'
      })
        .then(res => res.json())
        .catch(err => {
          let error = ''
          if (
            err.request &&
            (err.request.status === 404 || err.request.status === 502)
          ) {
            error = `Error with API: ${err.response.statusText}`
          } else if (err.request && err.request.status === 0 && !err.response) {
            error =
              'Something went wrong with the request, no response was given.'
          } else {
            error = err.response || JSON.stringify(err) || err
          }
          cartState.setState({
            apiErrors: [error],
            loading: false
          })
        })
      console.log(shippingRes)
      return
      shippingRes.products.forEach(product => {
        const regexp = new RegExp(product.id, 'gi')
        const updatedItem = items.find(({ id }) => regexp.test(id))

        if (!updatedItem) {
          console.warn('Item not found and being removed from the array')
          const index = itemState.state.items.indexOf(updatedItem)
          const updated = [...itemState.state.items]
          updated.splice(index, 1)
          itemState.setState({
            items: updated
          })
          return
        }
        updatedItem.price = product.price
        itemState.setState({
          items: itemState.state.items.map(
            item => (item.id === product.id ? updatedItem : item)
          )
        })
      })
      updated.shippingOptions = shippingRes.shippingOptions
      Object.keys(updated.shippingOptions).forEach(k => {
        this.setState({
          shippingOption: { ...this.state.shippingOption, [k]: 0 }
        })
        updated.setShip = updated.setShip
          ? { ...updated.setShip, [k]: 0 }
          : { [k]: 0 }
      })

      updated.success = shippingRes.success
      updated.cartId = shippingRes.cartId
      updated.locations = shippingRes.locations
      userInfo.setState({
        preOrderInfo: updated
      })
      cost.setState({
        tax: shippingRes.tax,
        shipping: shippingRes.shipping,
        shippingOptions:
          Object.keys(updated.shippingOptions).length > 0
            ? updated.shippingOptions
            : null
      })
      cartState.setState({
        loading: false,
        apiErrors: shippingRes.errors.length > 0 ? shippingRes.errors : null
      })
      if (shippingRes.errors.length > 0) {
        removeCookies()
        shippingRes.errors.forEach(err => {
          if (err.includes('CRT-1-00013')) {
            itemState.setState({ coupon: '' })
          }
        })
      }
    }
  }

  render() {
    return (
      <Subscribe to={[cartState, cost, itemState]}>
        {(cart, cost, itemState) => {
          if (cart.loading) {
            return (
              <div className="Loading">
                <div className="Loader">
                  <FoldingCube size={50} color="rgb(0, 207, 255)" />
                </div>
              </div>
            )
          }
          if (cart.apiErrors) {
            return (
              <div className="ShippingErrors">
                <div className="ErrorsTitle">
                  Please Contact Customer Support
                </div>
                <div className="ErrorsContact">
                  (contact information for customer support)
                </div>
                <div className="Msgs">
                  {cart.apiErrors.map((error, i) => {
                    return (
                      <div key={i} className="Err">
                        {error}
                      </div>
                    )
                  })}
                </div>
                <style jsx>{styles}</style>
              </div>
            )
          }
          return (
            <div className="ShippingOptionsContainer">
              <div className="ShippingOptions">
                {cost.shippingOptions ? (
                  <div className="ShipOptionLine">
                    {Object.keys(cost.shippingOptions).map((k, i) => {
                      const shipOptions = cost.shippingOptions[k]
                      const updatedProducts =
                        shipOptions.products.length === 0
                          ? []
                          : shipOptions.products.map(product =>
                              itemState.items.find(
                                item => item.id === product.id
                              )
                            )
                      return (
                        <div className="ShippingInputs" key={i}>
                          {shipOptions.options.map((shipOption, i) => {
                            return (
                              <div className="ShippingSection" key={i}>
                                <div className="SectionTitle">
                                  4. {shipOption.name} Shipping Options
                                </div>
                                {updatedProducts.length > 0 ? (
                                  <div className="ShippingProducts">
                                    {updatedProducts.map((product, i) => (
                                      <div key={i}>
                                        for{' '}
                                        {shipOption.name === 'Freight'
                                          ? 'Large'
                                          : 'Small'}{' '}
                                        {product.name} from{' '}
                                        {k.charAt(0).toUpperCase() + k.slice(1)}
                                      </div>
                                    ))}
                                  </div>
                                ) : null}
                                <div
                                  className="CheckboxContainer"
                                  onClick={() =>
                                    this.changeShipping({ [k]: i })
                                  }
                                >
                                  <label>
                                    <div className="ShippingName">
                                      {shipOption.carrier
                                        ? shipOption.carrier.serviceType
                                        : null}{' '}
                                      {shipOption.name}
                                    </div>
                                    <div className="ShippingPrice">
                                      ${shipOption.amount}
                                    </div>
                                    <input
                                      type="radio"
                                      value={i}
                                      className="ShippingInput"
                                      onChange={() =>
                                        this.setState({
                                          shippingOption: {
                                            ...this.state.shippingOption,
                                            [k]: i
                                          }
                                        })
                                      }
                                      checked={
                                        this.state.shippingOption[k] === i
                                          ? true
                                          : false
                                      }
                                    />
                                    <span className="Checkbox" />
                                  </label>
                                </div>
                              </div>
                            )
                          })}
                        </div>
                      )
                    })}
                  </div>
                ) : null}
              </div>
              <style jsx>{styles}</style>
            </div>
          )
        }}
      </Subscribe>
    )
  }
}
Halcyon:

問題は、React関連ではなく、html関連です。デフォルトでは、ラベルをクリックすると、関連付けられている入力要素のonClickイベントもトリガーされます。あなたの場合、onClickイベントはラベルと入力の両方にアタッチされます。したがって、ラベルをクリックすると、イベントが2回発生します。1回はラベルに対して、もう1回はそれに関連付けられた入力に対して発生します。

編集:onClickリスナーを入力に接続することは、問題の可能な解決策です

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

表示関数が2回呼び出されるのはなぜですか?

分類Dev

なぜ非同期関数が2回呼び出されるのですか?

分類Dev

storage.singleで関数が2回呼び出されるのはなぜですか?

分類Dev

iOSアプリの関数が2回呼び出されるのはなぜですか?

分類Dev

HTMLなぜ関数ドロップが1回ではなく4回呼び出されるのですか?

分類Dev

jQuery:関数が2回呼び出されます。伝搬?なぜこれが起こるのですか?

分類Dev

このF#関数が1回だけ実行されるのはなぜですか?2回呼び出すと、1回だけ実行されます

分類Dev

ReactNativeでrender()が2回呼び出されるのはなぜですか?

分類Dev

onNewIntentがSearchActivityから2回呼び出されるのはなぜですか?

分類Dev

1回使用するインポートされたモジュール関数が2回呼び出されるのはなぜですか?

分類Dev

関数が 1 回ではなく n+1 回呼び出される - なぜですか?

分類Dev

関数が 2 回目に呼び出されないのはなぜですか?

分類Dev

PrintStream.close()が2回呼び出されるのはなぜですか?

分類Dev

ngOnInitが2回呼び出されるのはなぜですか?

分類Dev

ngOnInitが2回呼び出されるのはなぜですか?

分類Dev

mainが2回呼び出されるのはなぜですか?

分類Dev

res.sendが2回呼び出されるのはなぜですか?

分類Dev

Dispatch Group Notifyが2回呼び出されるのはなぜですか?

分類Dev

`GetFormat`が2回呼び出されるのはなぜですか?

分類Dev

onSelectionChangeが2回呼び出されるのはなぜですか?

分類Dev

initState()が2回呼び出されるのはなぜですか?

分類Dev

awakeFromInsertが2回呼び出されるのはなぜですか?

分類Dev

viewDidLoadが2回呼び出されるのはなぜですか

分類Dev

OnCollisionEnter が 2 回呼び出されるのはなぜですか?

分類Dev

DatabaseInitializerが2回呼び出されるのはなぜですか?

分類Dev

setInterval関数が1回だけ呼び出されるのはなぜですか?

分類Dev

React Hooks Axios API呼び出しが2回返されるのはなぜですか?

分類Dev

Kinetic.js:関数の2回目の呼び出しでのみ画像が表示されるのはなぜですか?

分類Dev

postgresqlで、なぜ_PG_initが2回呼び出されるのですか?

Related 関連記事

  1. 1

    表示関数が2回呼び出されるのはなぜですか?

  2. 2

    なぜ非同期関数が2回呼び出されるのですか?

  3. 3

    storage.singleで関数が2回呼び出されるのはなぜですか?

  4. 4

    iOSアプリの関数が2回呼び出されるのはなぜですか?

  5. 5

    HTMLなぜ関数ドロップが1回ではなく4回呼び出されるのですか?

  6. 6

    jQuery:関数が2回呼び出されます。伝搬?なぜこれが起こるのですか?

  7. 7

    このF#関数が1回だけ実行されるのはなぜですか?2回呼び出すと、1回だけ実行されます

  8. 8

    ReactNativeでrender()が2回呼び出されるのはなぜですか?

  9. 9

    onNewIntentがSearchActivityから2回呼び出されるのはなぜですか?

  10. 10

    1回使用するインポートされたモジュール関数が2回呼び出されるのはなぜですか?

  11. 11

    関数が 1 回ではなく n+1 回呼び出される - なぜですか?

  12. 12

    関数が 2 回目に呼び出されないのはなぜですか?

  13. 13

    PrintStream.close()が2回呼び出されるのはなぜですか?

  14. 14

    ngOnInitが2回呼び出されるのはなぜですか?

  15. 15

    ngOnInitが2回呼び出されるのはなぜですか?

  16. 16

    mainが2回呼び出されるのはなぜですか?

  17. 17

    res.sendが2回呼び出されるのはなぜですか?

  18. 18

    Dispatch Group Notifyが2回呼び出されるのはなぜですか?

  19. 19

    `GetFormat`が2回呼び出されるのはなぜですか?

  20. 20

    onSelectionChangeが2回呼び出されるのはなぜですか?

  21. 21

    initState()が2回呼び出されるのはなぜですか?

  22. 22

    awakeFromInsertが2回呼び出されるのはなぜですか?

  23. 23

    viewDidLoadが2回呼び出されるのはなぜですか

  24. 24

    OnCollisionEnter が 2 回呼び出されるのはなぜですか?

  25. 25

    DatabaseInitializerが2回呼び出されるのはなぜですか?

  26. 26

    setInterval関数が1回だけ呼び出されるのはなぜですか?

  27. 27

    React Hooks Axios API呼び出しが2回返されるのはなぜですか?

  28. 28

    Kinetic.js:関数の2回目の呼び出しでのみ画像が表示されるのはなぜですか?

  29. 29

    postgresqlで、なぜ_PG_initが2回呼び出されるのですか?

ホットタグ

アーカイブ