我只是使用react.js在我的机器人框架网络聊天(v-4)中添加了自动提示/自动完成功能。但是我需要解决一些问题。
1.)
在获得建议的同时,我要在网络建议中输入要在建议列表中加粗的单词。我做到了,但是我现在面临的问题是它只使第一个字母变为粗体(如您在图像中所见),即使它是一种内在感觉,我也想使其变为粗体。
2.) 当我从建议列表中选择一个选项时,必须将其关闭。它会关闭其他选项,但不会关闭其他选项。(如图所示)。我也想结束。
3.) 我想使用向上/向下箭头从建议列表中选择选项。
请在以下链接中找到图片,
对于第一个问题,可能有两种方法可以做到这一点。为此,您可以使用React方式indexOf
在建议中查找用户文本的索引,然后将文本拆分为多个React元素,其中一个元素以粗体显示。如果您想像replace
现在一样使用,那么这可能是一个使用的好机会dangerouslySetInnerHTML
:
<div className="SuggestionParent" id="Suggestion1">
{this.state.suggestions.map(suggestion => (
<div className="Suggestion" onClick={this.handleSuggestionClick} >
<div dangerouslySetInnerHTML={this.getSuggestionHtml(suggestion)} />
</div>
))}
</div>
“危险”警告是因为您需要确保您不允许用户提供任何可能在内部HTML中使用的潜在值,否则他们可能会注入脚本标签。只要您的建议是从固定的数据库中提取的并且数据是安全的,那么您就可以了。否则,您将必须清理HTML,在这种情况下,根本不使用它可能会更容易dangerouslySetInnerHTML
。如果我们确实设置了内部HTML,则可以replace
用来直接将HTML标签应用于字符串:
getSuggestionHtml(suggestion) {
const lowerCaseSuggestion = suggestion.toLowerCase();
return {
__html: lowerCaseSuggestion.includes(this.state.suggestionTypedText) ? lowerCaseSuggestion
.replace(this.state.suggestionTypedText, `<b>${this.state.suggestionTypedText}</b>`) : lowerCaseSuggestion
};
}
对于第二个问题,您说您已经解决了。我可以看到您正在使用布尔开关暂时关闭对WEB_CHAT / SET_SEND_BOX操作的响应方式。
对于第三个问题,在弄清UI的工作方式时,您需要问自己很多设计注意事项,例如“如果用户在使用箭头键时将鼠标悬停在建议上,会发生什么? ”
和“是否应在用户按下Enter之前在发送框中预览突出显示的建议?”
我希望找到一个可以使用的React自动完成组件,而不用自己构建它,因为这已经解决了所有这些潜在的陷阱。不幸的是,两个著名的React自动完成软件包(here和here)都具有两个相同的问题:
但是,它们都是开源的,因此我们可以在它们之后建模自己的自动完成功能。我将指导您完成基本功能,然后您可以根据需要对其进行扩展。
键盘事件通常在React中使用onKeyDown
属性处理。我将其放置在一个既包含Web聊天又包含您的建议父项的元素上:
<div className={ROOT_CSS} onKeyDown={this.handleKeyDown.bind(this)}>
<div className={WEB_CHAT_CSS + ''}>
<ReactWebChat
这将处理所有按键操作,因此您需要一种方法来路由至正确按键的功能。您可以使用一条switch
语句,但是react-
autocomplete的源代码使用查找对象,我认为这很聪明。
keyDownHandlers = {
ArrowDown(event) {
this.moveHighlight(event, 1);
},
ArrowUp(event) {
this.moveHighlight(event, -1);
},
Enter(event) {
const {suggestions} = this.state;
if (!suggestions.length) {
// menu is closed so there is no selection to accept -> do nothing
return
}
event.preventDefault()
this.applySuggestion(suggestions[this.state.highlightedIndex]);
},
}
handleKeyDown(event) {
if (this.keyDownHandlers[event.key])
this.keyDownHandlers[event.key].call(this, event)
}
我已经将向上和向下箭头的功能集中到一个功能中:moveHighlight
。您将需要在您的状态中定义一个新属性,以跟踪键盘已选择了哪些建议。我保留了highlightedIndex
来自react-
autocomplete 的名称。
moveHighlight(event, direction) {
event.preventDefault();
const { highlightedIndex, suggestions } = this.state;
if (!suggestions.length) return;
let newIndex = (highlightedIndex + direction + suggestions.length) % suggestions.length;
if (newIndex !== highlightedIndex) {
this.setState({
highlightedIndex: newIndex,
});
}
}
为了使Enter键应用建议,您需要集中化功能,以便其与单击鼠标相同。
async handleSuggestionClick(event) {
await this.applySuggestion(event.currentTarget.textContent);
}
async applySuggestion(newValue) {
await this.setState({ typingChecking: "false", suggestions: [], highlightedIndex: 0 });
this.state.suggestionCallback.dispatch({
type: 'WEB_CHAT/SET_SEND_BOX',
payload: {
text: newValue,
}
});
await this.setState({ typingChecking: "true" });
}
最后,确保使用该highlightedIndex
属性以不同的方式呈现突出显示的索引。
getSuggestionCss(index) {
return index === this.state.highlightedIndex ? HIGHLIGHTED_CSS : SUGGESTION_CSS;
}
. . .
<div className="SuggestionParent" id="Suggestion1">
{this.state.suggestions.map((suggestion, index) => (
<div className={this.getSuggestionCss(index)} key={index} onClick={this.handleSuggestionClick} >
<div dangerouslySetInnerHTML={this.getSuggestionHtml(suggestion)} />
</div>
))}
</div>
建议列表显示所有匹配优化建议规则的资源列表,用户可根据建议对资源进行处理。 建议列表显示所有匹配优化建议规则的资源列表。建议列表中的资源都有一定程度的浪费,从节省成本的角度考虑,需要用户对匹配规则的资源处理等。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “优化建议/安全检查/建议列表” 菜单项,进入建议列表页面。 处理 该功能用于按照优化建议对匹配规则扫描出来的资源进行处理。
建议列表显示所有匹配优化建议规则的资源列表,用户可根据建议对资源进行处理。 建议列表显示所有匹配优化建议规则的资源列表。建议列表中的资源都有一定程度的浪费,从节省成本的角度考虑,需要用户对匹配规则的资源处理等。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “优化建议/成本优化/建议列表” 菜单项,进入建议列表页面。 处理 该功能用于按照优化建议对匹配规则扫描出来的资源进行处理。
V2Ray 支持以下协议: Blackhole Dokodemo-door Freedom HTTP MTProto Shadowsocks Socks VMess
为了尽可能满足web开发中方方面面的需要,whistle提供基本上覆盖抓包调试工具可以做的所有事情的对应协议,按功能可以分以下类别,大家可以按需查找: 有关协议的优先级及匹配情况参见:匹配原则 @ 功能 @ (用于功能扩展及引入远程规则) 设置UI样式 style (设置抓包列表样式) 设置hosts host (设置host) 设代理 proxy(http-proxy) (代理到其它http代理
问题内容: 目前,这是一个理论性的问题,但是我可能需要长期做一些事情。 当您访问google.com并开始输入搜索内容时,它将在一个小的下拉菜单中为您提供建议。我可以肯定地说,他们使用AJAX来发送您输入的内容并获得可能的建议列表。我要弄清楚的是他们实际如何显示该列表。它看起来像一个简单的下拉列表,只是顶部没有实际的选择框。在我的心中,毫无疑问,这就像一个CSS技巧一样简单,它可以将选择框从它产生
问题内容: 我有这种方法: 不幸的是,编译器向我显示了以下问题: 因为已弃用。 不使用该如何改写此方法? 问题答案: 您可以用和替换它(您需要使用兼容性包来支持API版本11之前的设备)。 但是,您似乎只使用了一次查询:您甚至可能不需要它。也许这行得通吗?