Jay
Jay

Reputation: 9477

reactjs enable disable button through a function not working

In ReactJS, I want to enable/disable a button dynamically. For that, I created a function to check the form field from state. But it's not working.

I tried the below code

render() {


    const canSave = true;  // Working

    // Not working
    const canSave = () => {
        const { paramCode, paramDesc, paramValue } = this.state.row;
        if (this.state.row && paramCode && paramDesc && paramValue) {
            return true;
        }
        return false
    }



    /* For Create Dialog  */
    let createDialogFooter = <div className="ui-dialog-buttonpane p-clearfix">
        <Button label="Save"  disabled={canSave} />
    </div>;

Console Error:-

    index.js:1375 Warning: Invalid value for prop `disabled` on <button> tag. Either remove it from the element, or pass a string or number value to keep it in the DOM. For details, see https : // fb.me/react-attribute-behavior
        in button (created by Button)
        in Button (at SearchPriceParameters.jsx:210)
        in div (at SearchPriceParameters.jsx:209)
        in div (created by Dialog)
        in div (created by Dialog)
        in Transition (created by CSSTransition)
        in CSSTransition (created by Dialog)
        in Dialog (at SearchPriceParameters.jsx:249)
        in div (at SearchPriceParameters.jsx:233)
        in SearchPriceParameters (created by Context.Consumer)
        in Route (at App.js:34)
        in Switch (at App.js:29)
        in div (created by Container)
        in Container (at App.js:28)
        in div (at App.js:27)
        in div (at App.js:16)
        in App (at src/index.js:15)
        in Router (created by BrowserRouter)
        in BrowserRouter (at src/index.js:14)

Update:-

Thanks for the answers, now the below-fixed code works.

render() {
    /** Enable / disable button */
    const canSave = () => {
        if (this.state.row) {
            const { paramCode, paramDesc, paramValue } = this.state.row;
            return (paramCode && paramDesc && paramValue);
        }
        return false;
    }


    /* For Create Dialog  */
    let createDialogFooter = <div className="ui-dialog-buttonpane p-clearfix">
        <Button label="Save" icon="pi pi-check" onClick={this.save} className="p-button-warning" disabled={!canSave()} />
    </div>;

Upvotes: 3

Views: 3989

Answers (3)

tarzen chugh
tarzen chugh

Reputation: 11247

It's better you move the function out of render method.

Also I think you don't need to check this.state.row again for falsy values.

import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";

class App extends React.Component {
  state = {
    row: { paramCode: "hello" }
  };
  canSave = () => {
    const { paramCode } = this.state.row;
    return paramCode;
  };
  render() {
    let showButton = <button disabled={this.canSave()}>Click me</button>;
    return <div className="App">{showButton}</div>;
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Hope that helps!!!

Upvotes: 1

Ajay Ghosh
Ajay Ghosh

Reputation: 439

what is the trigger to enable/disable button dynamically?

Are you changing the values in the state? if so append a flag with the existing state which indicate the disable/enable value of the button.

Upvotes: 1

Dupocas
Dupocas

Reputation: 21297

Two problems here.

You're never returning false. Try like this.

const canSave = () => {
     const { paramCode, paramDesc, paramValue } = this.state.row;
     return (this.state.row && paramCode && paramDesc && paramValue)
}

You're never executing canSave

<Button label="Save"  disabled={canSave()} />

Upvotes: 6

Related Questions