已转换的函数组件(带有角色权限的切换按钮)停止工作。

huangapple go评论86阅读模式
英文:

Converted function component (toggle button with role permissions) stopped working

问题

我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff"变量的具体内容,但以下是代码的翻译部分:

```jsx
我不知道"islplace""islon""isloff"变量的具体内容但以下是代码的翻译部分

```jsx
我不知道"islplace"、"islon"和"isloff

<details>
<summary>英文:</summary>

I had to convert my class component into function component since I will have to use hooks for redux(useDispatch();)
Everything seemed okay except the thing that toggle button doesnt want to work.
As a comparison I post a class component code(a bit of it) and function component code(more of it)

     state = {
        open: true,
        role: &quot;&quot;
    }


     componentDidMount() {
     if (this.props.auth.user) 
    {
    this.setState({role: this.props.auth.user.role});
     }
     }

     checkRole = (role) =&gt; {
     if (role === &#39;Menager&#39; || role === &#39;Technolog&#39;)
      {
      return true }
    else 
    {
      return false
    };
    }

    toggleImage = () =&gt; {
    if(this.checkRole(this.state.role)) {
    this.setState({open: !this.state.open})
    };
    }

And here is the function component code: 

     const Islbutton = props =&gt; {
  
      const [open, setOpen] = useState(true);
     const [role, setRole] = useState(&#39;&#39;);



     useEffect(() =&gt; {
     if (props.auth.user) 
     {
     setRole({role: props.auth.user.role});
       }
     });


     const checkRole = (role) =&gt; {
     if (role === &#39;Menager&#39; || role === &#39;Technolog&#39;)
      {
       return true }
     else 
    {
      return false
    };
    }

      const toggleImage = () =&gt; {
     if(checkRole(role)) {
     setOpen({open: !open})
     };
     }

     const getImageName = () =&gt; open ? &#39;islOnn&#39; : &#39;islOfff&#39;
 

 
            return(
              
              &lt;div&gt;
              
                &lt;img style={islplace} src={open ? islon : isloff }  onClick={()=&gt; toggleImage(role)} /&gt;
              &lt;/div&gt;
            );
    }



</details>


# 答案1
**得分**: 1

当您初始化状态时,您以一种方式创建了您的`open`状态,其中`open`是一个布尔原始值。

```javascript
const [open, setOpen] = useState(true);

现在,open的唯一可能值是truefalse

然后,在您的代码中,您还期望它保持这种形式,正如您在这里所看到的:

const getImageName = () => open ? 'islOnn' : 'islOfff'

正如您可以看到的,open并没有被用作对象。

但是,在您实际设置状态的代码中,您向setOpen函数传递了一个对象,正如您在这里看到的:

setOpen({open: !open})

这段代码应该被更改为接受truefalse,而不是带有open键的对象。

换句话说,代码可以这样编写:

const toggleImage = () => {
  if (checkRole(role)) {
    setOpen(!open); // 这里没有 {},它不是一个对象。
  }
}
英文:

When you initailized your state you made in a way where your open state is a boolean primitive

const [open, setOpen] = useState(true);

Now the only values for open are either true or false

Then further in your code you are also expecting to be in this same shape as you can see here.

const getImageName = () =&gt; open ? &#39;islOnn&#39; : &#39;islOfff&#39;

as you can see open is not being used as an object.

But in your code where you are actually setting the state you are passing an object to your setOpen function as you can see here

setOpen({open: !open})

this code should be changed to accept either true or false, and not an object with key of open.

In other words the code can be written like so.

 const toggleImage = () =&gt; {
if(checkRole(role)) {
setOpen(!open) // no {} here its not an object.
};
}

huangapple
  • 本文由 发表于 2020年1月6日 02:34:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/59603001.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定