【问题标题】:How can I disable checkboxes and radio buttons from separate components?如何禁用来自不同组件的复选框和单选按钮?
【发布时间】:2018-03-30 16:42:23
【问题描述】:

遇到这个 ReactJS(使用 Redux)问题:

如果未选择优质白色,则应禁用光泽饰面。单选按钮(高级)和复选框(光泽)在不同的组件中有不同的方法——看起来它们都使用状态来发送数据。

这是复选框

  buildCheckbox(item) {
    return (
      <Checkbox
        key={item.key}
        label={item.display}
        name={item.key}
        checked={this.props.order[item.key] || false}
        onChange={checked => this.handleCheck(checked, item.key)}
        disabled={item.disabled(this.props.order)}
      />
    );
  }

以及使用的handleclick方法

  handleCheck(checked, key) {
    const { params, updateOrder } = this.props;
    const { sessionId } = params;

    // if doulbeSided option is removed, then clear the inside file.
    if (key === 'doubleSided' && !checked) {
      updateOrder(sessionId, { inside: null });
    }

    // set ink coverage based on printed flag
    if (key === 'printed') {
      const inkCoverage = checked ? 100 : 0;
      updateOrder(sessionId, { inkCoverage });
    }

    // if unprinted, remove doublesided and gloss options
    if (key === 'printed' && !checked) {
      updateOrder(sessionId, { doubleSided: false });
      updateOrder(sessionId, { gloss: false });
    }

    updateOrder(sessionId, { [key]: checked });
  }

还有单选按钮的方法

  onClick(id, ordAttribute) {
    const { updateOrder, sessionId, validator } = this.props;
    updateOrder(sessionId, { [ordAttribute]: id });

    if (validator) validator(ordAttribute);
  }

我看到 Gloss 有一项服务,该服务通过此处的状态打印键切换是否已禁用

gloss: {
  display: 'Gloss Finish',
  key: 'gloss',
  component: 'checkbox',
  disabled: state => !state.printed,
},

我考虑过创建第四个单选按钮并删除光泽选项,但我不确定它是从哪里填充的 - 还考虑过在通过收音机激活的光泽样式上使用 display none按钮 - 但不知道从哪里开始。

刚刚声明了一份新工作,这是前员工的代码 - 试图弄清楚。看起来状态是通过这个 Action 方法激活的:

export const updateOrder = (sessionId, payload) => (dispatch, getState) => {
  dispatch(updateAction({ ...payload }));
  const state = getState();
  const ord = getNewOrderForm(state);
  const minOrdValue = getMinOrdValue(state);
  const { length, width, height, style, blankLength, blankWidth, qty, leadTime, sqFeet } = ord;
  const priceMatrix = style ? getPriceMatrix(state)[style.priceMatrix] : null;

  if (priceMatrix && style && style.calcPrice) {
    dispatch(dispatchNewPrice(ord, style, priceMatrix, minOrdValue));
  }

  if (shouldCalcBlank({width, length, height}, style)) {
    calcBlanks(style, {width, length, height})
    .then(blanks => dispatch(updateAction(blanks)))
    .catch(err => console.log('error', err))
  }

  if (blankLength && blankWidth && qty) {
    calcSquareFeet({ blankLength, blankWidth, qty })
      .then(sqFeet => {
        dispatch(updateAction({ sqFeet }));
        return sqFeet;
      })
      .then(sqFeet => sqFeet > 1000)
      .then(lrgSqFeet => {
        dispatch(updateAction({ lrgSqFeet }));
        return lrgSqFeet;
      })
      .then(lrgSqFeet => {
        if (lrgSqFeet && leadTime === 'rush') {
          dispatch(updateAction({ leadTime: 'standard' }));
        }
      });
  }

  if (sqFeet && (!blankLength || !blankWidth || !qty)) {
    dispatch(updateAction({ sqFeet: 0 }));
  }

  localStorage.setItem(sessionId, JSON.stringify(getNewOrderForm(getState())));
};

我考虑过添加一个单选按钮,其 id 为“clearwater”,因此我考虑向此方法添加一个 bool,然后可以将其作为 clearwater: false 访问(当 onClick 被激活时,updateOrder 然后将其更改为 clearwater : true,然后服务中的光泽对象将检查禁用: state => !state.printed && !state.clearwater (这不起作用):

export const generateNewOrder = (userid, style, sessionId = uuid()) => dispatch => {
  localStorage.setItem(
    sessionId,
    JSON.stringify({
      userid,
      style,
      sessionId,
      blindShip: true,
      inkCoverage: '100',
      printed: true,
    })
  );
  history.push(`/order/new/${style.styleCode}/${sessionId}`);
  dispatch(
    newOrder({
      userid,
      style,
      sessionId,
      blindShip: true,
      inkCoverage: '100',
      printed: true,
    })
  );

  if (style.type === 'static') {
    const { dims, blankLength, blankWidth } = style;
    const payload = {
      ...dims,
      blankLength,
      blankWidth,
    };

    dispatch(updateOrder(sessionId, payload));
  }
};

我希望通过更改附加到复选框的服务,我可以添加一个附加条件,该条件会导致禁用的功能依赖于 state.boardStyle,但这似乎不起作用(下图不是准确的,我把它改成了boardStyle):

http://oi65.tinypic.com/wknzls.jpg

这是使用 redux —— 对 redux 来说是一种新的东西——如果我遗漏了任何信息,请告诉我——我会发布任何东西来解决这个问题。

任何帮助都会很大——非常感谢!

【问题讨论】:

  • Premium White 单选按钮的 id 为“clearwater”,我可以访问 - 并且光泽有一个我可以访问的光泽键 - 我需要将此信息传递给另一个通过状态组件?
  • 这条线对我来说似乎很可疑:disabled: state =&gt; !state.printed 被调用 disabled={item.disabled(this.props.order)this.props.order.printed 存在吗?我知道它在那里说“状态”,但这不是传入的内容。此时您只是使用“状态”作为参数名称。
  • 是的,我正试图弄清楚它是从哪里拉出来的——它是在全局状态下设置的吗?我一直在寻找状态声明,但我能找到的只是参考。看起来 Map 正在用于映射项目——我不确定信息是如何填充的——(我找到了一个 mockData 文件,但它可能是通过 firebase 填充的?)
  • 正在考虑复习我的 reactJS 课程,但我真的希望我可以问另一个开发人员(我是这家公司唯一的开发人员)
  • 如果另一个状态变量也为假,是否有办法添加到该订单服务代码以禁用它? (这就是我采取的方法)

标签: javascript reactjs react-redux


【解决方案1】:

我想我想通了。 . .

可能有一种更简单的方法可以做到这一点,但这里是:

首先我在 Actions 的 generateNewOrder 方法上创建了一个新键 [bool](clearwater,设置为 false):

export const generateNewOrder = (userid, style, sessionId = uuid()) => dispatch => {
  localStorage.setItem(
    sessionId,
    JSON.stringify({
      userid,
      style,
      sessionId,
      blindShip: true,
      inkCoverage: '100',
      printed: true,
      clearwater: false,
    })
  );
  history.push(`/order/new/${style.styleCode}/${sessionId}`);
  dispatch(
    newOrder({
      userid,
      style,
      sessionId,
      blindShip: true,
      inkCoverage: '100',
      printed: true,
      clearwater: false
    })
  );

  if (style.type === 'static') {
    const { dims, blankLength, blankWidth } = style;
    const payload = {
      ...dims,
      blankLength,
      blankWidth,
    };

    dispatch(updateOrder(sessionId, payload));
  }
};

这让我可以访问这个状态值,然后我可以在按下单选按钮时在 onclick 中使用它。如果 id 是 clearwater,则 bool 将设置为 true,否则设置为 false(仅适用于其他两个选项,因为此代码用于其他 ID)

  onClick(id, ordAttribute) {
    const { updateOrder, sessionId, validator } = this.props;
    updateOrder(sessionId, { [ordAttribute]: id });

    if (validator) validator(ordAttribute);

    if (id === 'clearwater') {
      updateOrder(sessionId, { clearwater: true });
    } else if (id === 'kraft' || id === 'std_white_two_side'){
      updateOrder(sessionId, { clearwater: false });
    }
  }

然后我需要做的就是将它添加到服务中。如果没有打印 !printed 或 not clearwater !clearwater,复选框将被禁用

  const printing = {
    doubleSided: {
      display: 'Two Sided Print',
      key: 'doubleSided',
      component: 'checkbox',
      disabled: state => !state.printed,
    },
    printed: {
      display: 'Printed?',
      key: 'printed',
      component: 'checkbox',
      disabled: () => false,
    },
    gloss: {
      display: 'Gloss Finish',
      key: 'gloss',
      component: 'checkbox',
      disabled: state => !state.printed || !state.clearwater,
    },
  };

【讨论】:

    【解决方案2】:

    我有一个可以回答类似问题的工作示例,请看一下。整个逻辑在 redux 中完成: Want to uncheck the node of the tree structure in React JS

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多