首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >JSX select元素似乎不能自动选择(实现'selected') on选项。我是不是遗漏了什么?

JSX select元素似乎不能自动选择(实现'selected') on选项。我是不是遗漏了什么?
EN

Stack Overflow用户
提问于 2021-11-03 23:11:18
回答 1查看 57关注 0票数 0

我有一个<select>标记,我用它来创建自己的自定义<SelectField>组件,如下所示:

代码语言:javascript
运行
AI代码解释
复制
export default function SelectField(props) {
  /* 
  PARAMS:
    - fieldname (String)
    - fieldID (String)
    - options (Array([Object, Object...]) [{"option_value": "option_name"}, ...])
    - init_value (String "option_value")
  */
  const generate_options = () => {
    // Function for handling SelectField options
    let element_list = [];
    element_list.push(
      <SelectOption key={0} option_value="" option_text="None" />
    );

    var count = 1;

    if (!Array.isArray(props.options)) {
      for (var [value, name] of Object.entries(props.options)) {
        element_list.push(
          <SelectOption key={count} option_value={value} option_text={name} />
        );
        count += 1;
      }
    } else {
      props.options.forEach((subject) => {
        element_list.push(subject.to_option());
      });
    }
    return element_list;
  };

  const nameToString = () => {
    // Converts props.fieldname into a properly formatted name
    if(props.fieldname.indexOf("_")){
      var full_field_name = `${props.fieldname.split("_").join(" ")}`;
      return `${full_field_name[0].toUpperCase() + full_field_name.slice(1)}`;
    };
    return `${props.fieldname[0].toUpperCase() + props.fieldname.slice(1)}`;
  };

  return (
    <div className="form-group">
      <label htmlFor={props.fieldname}>
        {nameToString()}:
      </label>
      <select
        name={`${props.fieldname}`}
        id={`${props.fieldID}`}
        className="countries"
        defaultValue={props?.init_value ? `${props.init_value}` : ""}
      >
        {generate_options()}
      </select>
    </div>
  );
}

(PS。不要介意className -它真的不应该相关。但谁知道像我这样的初学者。DS)。现在,我想使用该字段在我的web应用程序(由Django提供支持)中为Subjects创建一个<select>标记,并为其创建了一个如下所示的子组件:

代码语言:javascript
运行
AI代码解释
复制
export function SubjectSelectField(props) {
  const [subjects, setSubjects] = useState([]);

  useEffect(() => {
    const getSubjects = async () => {
      let reqObj = new RequestHandler("/courses/subjects/");
      const data = await reqObj.sendRequest();
      setSubjects(
        data.map((item) => {
          return new Subject(item);
        })
      );
    };
    getSubjects();
  }, []);
  console.log({ subjects });

  return <SelectField options={subjects} {...props} />;
}

在使用此组件呈现页面时,我得到了以下console.logs:

代码语言:javascript
运行
AI代码解释
复制
{
    "subjects": [
        {
            "id": 6,
            "name": "Art"
        },
        {
            "id": 4,
            "name": "Biology"
        },
        {
            "id": 5,
            "name": "Chemistry"
        },
        {
            "id": 3,
            "name": "Geography"
        },
        {
            "id": 2,
            "name": "Language"
        },
        {
            "id": 1,
            "name": "Mathmatics"
        },
        {
            "id": 7,
            "name": "Physics"
        },
        {
            "id": 8,
            "name": "Social Studies"
        }
    ]
}

作为参考,这是我的自定义Subject类(ES6):

代码语言:javascript
运行
AI代码解释
复制
export class Subject {
  constructor({ id, name }) {
    this.id = id;
    this.name = name;
  }
  to_option() {
    return (
      <SelectOption
        key={this.id}
        option_value={this.id}
        option_text={this.name}
      />
    );
  };
}

<SelectOption>组件:

代码语言:javascript
运行
AI代码解释
复制
export function SelectOption(props) {
  return <option value={`${props.option_value}`} >{`${props.option_text}`}</option>;
}

因此,我期望的输出是<SelectField>自动将selected属性赋给具有<SelectField>init_value属性值的选项。我将<SelectField>用于另一种类型的字段,我称之为<CountrySelectField>,它工作得很好。我希望预先选择的国家是根据它的init_value正确选择的。

该组件如下所示:

代码语言:javascript
运行
AI代码解释
复制
export function CountrySelectField(props) {
  return (
    <SelectField
      init_value={props?.student?.country ? `${props.student.country}` : ""}
      {...props}
    />
  );
}

正如我所提到的,如果我将一个值传递给这个组件的init_value属性,它就会像预期的那样执行,并使用设置了selected属性的正确选项进行呈现。

<SubjectSelectField>没有按照我期望的方式呈现--正确的<option>设置了selected属性。

为什么它不起作用?

编辑:

将Subject类更改为React功能组件:

代码语言:javascript
运行
AI代码解释
复制
export function Subject(props){
  const id = props.subject.id;
  const name = props.subject.name;

  console.log(id, name, props.subject);
  if(props.option){
    return(
      <SelectOption
        key={id}
        option_value={id}
        option_text={name}
      />
    );
  }
  return(
    <h1>{name} - {id}</h1>
  );
}

为了让其他东西正常工作,我也改变了这些东西:

代码语言:javascript
运行
AI代码解释
复制
export function SubjectSelectField(props) {
  // ...
  setSubjects(
        data.map((item) => {
          return <Subject subject={item} />;
        })
      );
  // ...

该选项仍不会被自动选择。我还有其他的字段,它们使用的大部分都是相同的逻辑(SelectField在其他地方也用得很好),但是我在这里显然搞乱了一些东西。

PS。如果你有时间进行语言监督,你肯定也有时间研究这个问题。“不是吗,”halfer?天啊..。DS.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-09 18:08:34

我松了一口气,因为我自己解决了这个问题,问题是我从来没有在SubjectSelecField上实现检查,以便仅在从服务器加载Subject时才呈现<select>字段。例如:

代码语言:javascript
运行
AI代码解释
复制
export function SubjectSelectField(props) {
  const [subjects, setSubjects] = useState([]);
  // Here I use 'loaded' as a check variable when rendering.
  const [loaded, setLoaded] = useState(false);

  useEffect(() => {
    const getSubjects = async () => {
      let reqObj = new RequestHandler("/courses/subjects/");
      try{
        const data = await reqObj.sendRequest();
        setSubjects(
          data.map((item) => {
            return <Subject subject={item} />;
          })
        );
        // If the Subjects load properly, set 'loaded' to true.
        setLoaded(true);
      }
      catch(error){
        console.log(`Something went wrong when trying load Subjects from server!`);
        console.error(error);
        // Else we make sure its set to false.
        setLoaded(false);
      }
      
    };
    getSubjects();
  }, []);
  console.log({ subjects });

  // Here, before rendering, we check for the 'loaded' variable
  // to make sure the <select> tag doesn't try to load without
  // the <option> tags. Otherwise, the 'defaultValue' prop won't work.
  if(loaded) return <SelectField init_value={props.init_value} options={subjects} {...props} />;
  return <span>Loading Subject list...</span>;
}

至少感谢大家对它的研究:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69835505

复制
相关文章
jQuery实现Select自动选择默认值
==========================================================================================
IT工作者
2021/12/28
2.2K0
vue3 实现 select 下拉选项
本人学生 🐶, 平时在外面没事接点小项目小赚一笔补贴生活费. 之前一直都是使用Vue2.x的版本做项目, 暑假刚刚学习了Vue3想着新项目就直接用Vue3上手. 效果展示 好了, 话不多说先给大佬们看看效果样式: 组件难点 因为下拉框可能会在某些情况下被挡住, 所以这里的下拉框被挂载到了body标签上, 并且下拉框中的选项往往是以<slot>插槽的形式编写, 这里就会困扰到很多小白, 搞不明白怎么样才能在 下拉框 与触发下拉按钮 之间关联响应式事件与数据. 组件的使用 <tk-select selec
玖柒的小窝
2021/10/22
4.8K0
vue3 实现 select 下拉选项
select多路选择的模拟实现
有时候有这样一种应用场景:需要等待多个事件到达,然后返回尽可能多的事件;如果没有事件到达就阻塞等待。例如服务器等待客户端建立连接,或者等待客户端数据等就有这种应用需求。 在go语言里,可以利用select原语和它的非阻塞(default)分支组合实现这个功能: // 从ch获取尽可能多的数据放到events里,并返回实际数量;如果没有数据就阻塞等待 func wait(ch chan int, events []int) int { count := 0 for count < len(ev
李海彬
2018/03/22
1.2K0
select元素属性分析及实现原理
FORWORD_ONLY 结果集的游标只能向下滚动。 SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。 SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
用户8983410
2021/10/07
8410
React 系列教程 1:实现 Animate.css 官网效果
前言 这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果。对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就是添加类与删除类的操作。这对于学习 React 来说是一个非常简易的例子,但是我并不会在教程中介绍相关的前置知识,比如 JSX、ES6 等,对于小白来说可能还会有一些困惑的地方,所以还要了解一下 React 相关的基础知识。虽然 React 有很多值得深究的知识,但这个系列教程并不会涉及高大深的内容。 预告一
叙帝利
2018/05/28
1.8K0
React 系列教程 1:实现 Animate.css 官网效果
这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果。对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就是添加类与删除类的操作。这对于学习 React 来说是一个非常简易的例子,但是我并不会在教程中介绍相关的前置知识,比如 JSX、ES6 等,对于小白来说可能还会有一些困惑的地方,所以还要了解一下 React 相关的基础知识。虽然 React 有很多值得深究的知识,但这个系列教程并不会涉及高大深的内容。
叙帝利
2018/07/31
1.9K0
JSX是什么?
JSX 是 JavaScript 的扩展语法,这种 <MyButton></MyButton> 标签的写法就是 JSX。JSX 编写的组件通过预处理器 babel 解析后,再交给 React 库渲染到指定父容器下,形成最终html页面。
Learn-anything.cn
2021/11/28
9220
select选择 原
使用select选择,下面展示出选择的内容,用2种方法实现 一、未用bootstrap Table插件写法 <!doctype html> <html> <head> <meta charset="utf-8"> <title>select选择</title> <link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="css/main.css
tianyawhl
2019/04/04
1.2K0
【译】JSX 如何生成 HTML 元素?
JSX 使 我们更容易编写 React 组件。 有些人可能会发现 JSX 具有很陡峭的学习曲线,这是完全可以理解的。 它不完全是 HTML,也不完全是 JavaScript,所以学习它可能需要一些时间来适应。
腾讯IVWEB团队
2020/06/28
2.2K0
当说到“敏捷”,你漏了什么?
现在,越来越多的企业和软件从业者都接受了“敏捷”概念。在我做持续交付咨询的时候,也可以听到客户能够把“敏捷宣言”倒背如流:
顾宇
2018/08/17
3770
为什么我不建议你用 Select * ?
应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。
JavaFish
2019/10/17
1.7K0
React技巧之select标签设置占位符
原文链接:https://bobbyhadz.com/blog/react-placeholder-select[1]
chuckQu
2022/08/19
6990
React技巧之select标签设置占位符
学用Hooks写React组件——基础版Select组件
通过一个父组件包裹显示框组件和下拉框组件,这样的实现方式简单粗暴,而且能解决大部分场景,但是存在几个问题:
gary12138
2022/10/05
3.1K0
学用Hooks写React组件——基础版Select组件
vue动态选择select
本文实例讲述了vue中动态select的使用方法。分享给大家供大家参考,具体如下:
kirin
2020/06/15
1.7K0
Labview选项卡之实现被选择选项卡工作
有些时候,我们做界面,需要好多个界面切换。如果是同一个 VI 里界面切换,一般都是选项卡了。切换不同选项卡就切换界面了。
Gnep@97
2023/08/16
7931
Labview选项卡之实现被选择选项卡工作
AngularJS Select(选择框)
在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如下实例:
陈不成i
2021/07/23
2.5K0
鼠标操作、下拉列表、键盘操作
首先了解鼠标操作这个东西是怎么实现的,用了一个类,这个类叫做actionChains
清菡
2020/12/02
4.1K0
鼠标操作、下拉列表、键盘操作
React 深度编程:受控组件与非受控组件
作者:司徒正美 https://segmentfault.com/a/1190000012458996 受控组件与非受控组件在官网与国内网上的资料都不多,有些人觉得它可有可不有,也不在意。这恰恰显示React的威力,满足不同规模大小的工程需求。譬如你只是做ListView这样简单的数据显示,将数据拍出来,那么for循坏与就足够了,但后台系统存在大量报表,不同的表单联动,缺了受控组件真的不行。 受控组件与非受控组件是React处理表单的入口。从React的思路来讲,作者肯定让数据控制一切,或者简单的理解为,页
企鹅号小编
2018/01/30
1.7K0
点击加载更多

相似问题

为什么<选项selected="selected">不能工作?

20

我是不是遗漏了什么?

111

不能得到属性值,我是不是遗漏了什么?

12

Nginx位置指令似乎不起作用。我是不是遗漏了什么?

51

PayPal按钮不能正常工作,我是不是遗漏了什么?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文