【问题标题】:How do I pass a toggles state with its onChange-call in Ionic React?如何在 Ionic React 中通过 onChange 调用传递切换状态?
【发布时间】:2021-01-28 01:20:27
【问题描述】:

说,我有这个开关:

<IonToggle id="IonToggleDarkMode" slot="end" checked={vars.darkMode} onChange={darkModeToggle}></IonToggle>

vars.darkMode是toggle的保存值,所以在加载页面时设置状态。 所以,知道我想编写一个调用 onChange 的函数,但我不知道如何在这里传递或访问“checked”属性...

例如,让我们这样做:

function darkModeToggle() {
  togglestate = // ???
  console.log( togglestate )
}

我该怎么做?

我也读过一些关于onChange={e =&gt; darkModeToggle(e)} 的文章,但老实说,我不明白...e 似乎没有将checked 属性传输到任何地方。我考虑过为切换 id 运行一个选择器,然后读取它的值,但 API reference 明确指出不使用“值”,但要使用“检查”。

上下文代码:

import React from 'react';
//other import statements

const { useState } = React;
const DarkModeSwitch = () => {
  // here you set the initial state using the useState hook:
  const [isChecked, setIsChecked] = useState(false);
  const darkModeToggle = () => {
    console.log(isChecked);
    setIsChecked(!isChecked);
  }
}
//other logic, calculations, JS functions, etc

//UI content
const ExploreContainer: React.FC<ContainerProps> = ({ name }) => {
  return (
    <IonContent>
      <IonList>
        <IonItem>
          <IonLabel>DarkMode</IonLabel>
          <IonToggle id="IonToggleDarkMode" slot="end" checked={isChecked} onChange={() => darkModeToggle())} />
        </IonItem>
      </IonList>
    </IonContent>
  )
}

【问题讨论】:

  • 我也刚刚意识到,当我像这样设置切换状态时,它会永久保持打开状态并且无法切换 [关闭,在这种情况下]。那么,我怎样才能在切换时为切换分配一个选中状态而不破坏它呢?
  • 这是在功能组件还是类中? (如果它在功能组件中,则必须使用 React 钩子 useState 并在类中使用函数 setState())。
  • 它是一个功能组件。你能给我指出一个方向吗?钩子很可怕......

标签: javascript reactjs react-native ionic-framework ionic-react


【解决方案1】:

由于您有一个功能组件,您必须使用 useState 挂钩来处理您的暗模式的状态。在您的 JSX 中,您可以通过将 isChecked 状态设置为 checked 属性来使用状态来处理 IonToggle(或复选框)。 下面是一个例子,你可以用一个简单的复选框来做到这一点:

const { useState } = React;

const DarkModeSwitch = () => {
  
    // here you set the initial state using the
    // useState hook:
    const [isChecked, setIsChecked] = useState(false);

    const darkModeToggle = () => {
    // toggle the state 'isChecked'
    // this makes it true if false and vice versa
    setIsChecked(!isChecked);
  }
  
    return (
    <div>
        <input 
        type="checkbox" 
        checked={isChecked} 
        onChange={() => darkModeToggle()} 
      />
    </div>
  )
}

这是一个工作示例: Codepen

编辑: 使用您的上下文代码,它可能如下所示:

import React, { useState } from 'react';

const ExploreContainer: React.FC<ContainerProps> = ({ name }) => {

  // here you set the initial state using the useState hook:
  const [isChecked, setIsChecked] = useState(false);
  
  const darkModeToggle = () => {
    setIsChecked(!isChecked);
  }

  return (
    <IonContent>
      <IonList>
        <IonItem>
          <IonLabel>DarkMode</IonLabel>
          <IonToggle id="IonToggleDarkMode" slot="end" checked={isChecked} onChange={() => darkModeToggle())} />
        </IonItem>
      </IonList>
    </IonContent>
  )
}

【讨论】:

  • 您好,谢谢您的回答!我想我理解这个概念。但是,我看到您在 const.return 中包含了 return 语句。我正在使用sidemenu-template,现在我的逻辑在const ExploreContainer: React.FC&lt;ContainerProps&gt; 之上,在里面是我构建界面的return 语句。在这种情况下,我必须将您的代码放在哪里?我如何调用darkModeToggle 将我的存储值传递给它?
  • 我不太明白你的意思。您能否在原始帖子中提供更多代码?我认为 'const ExploreContainer: React.FC' 等同于 'const DarkModeSwitch = () => {' 只是使用 TypeScript 而不是普通的 JS(并且使用传递道具)。这意味着您将设置初始状态的行和其中的 darkModeToggle 函数。
  • 我已将代码的基本结构添加到原始帖子中。我试图在功能组件之外添加钩子等,因为我担心 return 语句会弄乱我的 UI。现在,例如darkModeToggle() 不适用于IonSwitch,因为它是另一个范围内的常量。但是如果不破坏 ExploreContainer 的 return 语句,我不知道将您提供的代码放在哪里...
  • 1.您应该在编辑代码时发表评论。您不会收到关于 SO 的编辑通知,但对于 cmets 您会收到通知 :) 2. 我已经实现了您提供的编辑(谢谢顺便说一句),但是切换现在卡在关闭状态,当您点击或单击它时,它不会不要改变。
  • 我发现了问题所在。切换不断更新,因为我强制 React 每 100 毫秒重新渲染一次(我需要界面实时反映对变量的更改)。不过,您的解决方案是正确的,我很感激。
【解决方案2】:

代码

  const [checked, setChecked] = useState(false);

模板

<IonToggle checked={checked} 
       onIonChange={(e) => setChecked(e.detail.checked)} />

【讨论】:

  • 对不起,什么?正如我所说,我对 React 和 JS 完全陌生。能详细点吗?
  • 不鼓励在 SO 上仅使用代码回答。解释帮助访问者将您的解决方案中的知识应用到他们自己的问题上,提高质量并增加长期价值。请考虑添加上下文或解释。
  • 我将把它留在这里,看看有多少人继续过来并支持关于“不鼓励在 SO 上仅使用代码的答案”的评论......真的,一条评论就足够了吗?跨度>
猜你喜欢
  • 2017-05-18
  • 2021-11-13
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 2015-03-28
  • 2020-10-23
相关资源
最近更新 更多