reactjs - 将 webkitspeechRecognition 设置为状态并更改语言
问题描述
所以,我已经设置
let recognition = new SpeechRecognition;
recognition.continuous = true;
recognition.interimResults = false;
recognition.lang = 'en-US';
this.setState({
recognition
});
console.log(this.state.recognition)
给了我语音识别对象。因为我不应该直接用 改变状态this.state.recognition.lang = 'ja-JP'
,所以我尝试创建一个新对象来将识别状态设置为:
let newObject = {...this.state.recognition, lang: 'ja-JP'}
但是,不会克隆console.log(newObject)
return{ lang: 'ja-JP' }
和其余属性。
这是 webkitspeechrecognition api 的问题吗?有没有办法让它工作?
解决方案
对象扩展运算符 ( ) 返回键值对...
的可枚举属性。Object
但并非所有从Object
原型继承的类型都具有可枚举的属性,看起来本机SpeechRecognition
类型就是其中之一——没有可迭代的键,只有不可枚举的属性。(所以,...(new SpeechRecognition)
甚至没有抛出错误;它尽职地返回了recognition
.
我认为您将需要创建一个new SpeechRecognition
具有所需的实例recognition.lang = 'ja-JP'
,然后再创建一个实例setState
。我知道,没有任何传播或方法可以从旧实例.assign()
创建新实例。SpeechRecognition
我可以看到这如何造成SpeechRecognition
浏览器正在分配内存的多个实例的情况;您可能需要发挥创意,并且完成delete
对旧SpeechRecognition
实例的引用setState
,以便垃圾收集可以完成其工作并只留下一个实例。
推荐阅读
- swift - 如何使用“ARKit”在两个 SCNNode 之间绘制自定义线
- javascript - 如何将 Uint8Array 的对象转换为字符串并将字符串转换回同一对象?
- html - 来自第三方主机的 iframe 上的 allow-same-origin 沙箱的安全风险是什么?
- jenkins - Jenkins/Groovy:如何将命名参数和闭包传递给同一个方法?
- sql - 使用 SQL 更新访问表
- visual-studio - 控制在 Visual Studio 中为英特尔 Fortran 项目编译哪些源文件的最佳方法是什么?
- css - 指定旧版 `inline-block` 显示值的新方法是什么?
- express - 无法连接到机器 A 上的 redis db,我正在尝试从机器 b 连接到它
- r - 检查 R 中的多列
- c# - 在 C# (Unity) 中使用静态临时变量有什么好处吗?