我有一个React应用程序,我想用我自己的select元素替换Webchat的输入栏(我使用的是react-select)。
下面是webchat下面的select元素:

return (
<div className="WebChat" >
<ReactWebChat //WebChat
className={ `${ className || '' } web-chat` }
directLine={ this.createDirectLine(token) }
store={ store }
styleSet={ styleSet } />
<Select //my select element
autoFocus="true"
className="basic-single"
classNamePrefix="select"
defaultValue={'default'}
isClearable={isClearable}
isSearchable={isSearchable}
name="Questions"
options={groupedQuestions}
closeMenuOnScroll= "true"
placeholder="Example"
/>
</div>
);感谢@tdurnford,下面是我的实现:
WebChat.js
import React from 'react'
import { createStore } from 'botframework-webchat'
import WebChatReact from './WebChatReact'
+import Searchbox from "./ImprovedSendBox"
+import setSendBox from "botframework-webchat-core/lib/actions/setSendBox";
+import submitSendBox from "botframework-webchat-core/lib/actions/submitSendBox";
import './WebChat.css'
export default class extends React.Component {
constructor(props) {
super(props);
this.handleFetchToken = this.handleFetchToken.bind(this);
const store = createStore({}, ({ dispatch }) => next => action => {
if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
name: 'webchat/join',
value: { }
}
});
setTimeout(() => {
dispatch({
type: 'WEB_CHAT/SEND_MESSAGE',
payload: { text:'Démarrer' }
}
);
}, 1000);
}
+ if (action.type === 'WEB_CHAT/SET_SEND_BOX') {
+ this.setState({
+ searchValue: action.payload.text,
+ })
+ }
return next(action);
});
this.state = {
store,
token: null,
+ searchValue: "",
+ searchSelection: "",
};
}
+ handleSearchInput = (e, { action }, store) => {
+ if (
+ action === "menu-close" ||
+ action === "input-blur" ||
+ action === "set-value"
+ ) {
+ return;
+ } else {
+ this.setState({ searchValue: e });
+ }
+ store.dispatch(setSendBox(e));
+ };
+ handleSearchSelection = (selection, store) => {
+ this.setState({
+ searchSelection: selection ? selection.label : "", //Clear Button à fix
+ searchValue: selection ? selection.label : ""
+ });
+ if (selection != null){
+ store.dispatch(setSendBox(selection.label));
+ }
+ };
async handleFetchToken() {
if (!this.state.token) {
const res = await fetch('https://directline.botframework.com/v3/directline/conversations', {
method: 'POST',
headers: {
"Authorization": "secret token ;)"
}});
const { token } = await res.json();
this.setState(() => ({ token }));
}
}
render() {
const { state: {
store,
token,
+ searchValue,
+ searchSelection
} } = this;
return (
<div className="WebChat">
<WebChatReact
className="react-web-chat"
onFetchToken={ this.handleFetchToken }
store={ store }
token={ token }
/>
+ <form className="form-inline">
+ <Searchbox
+ className="select"
+ value={searchSelection}
+ onChange={e => this.handleSearchSelection(e, store)}
+ inputValue={searchValue}
+ onInputChange={(e, action) => this.handleSearchInput(e, action, store)}
+ />
+ <button
+ id="submit"
+ onClick={ event => {
+ event.preventDefault();
+ store.dispatch(submitSendBox())
+ }}
+ >
+ Submit
+ </button>
+ </form>
</div>
);
}
}ImprovedSendBox.js
可以在Github上找到
结果:

如果你有任何问题,请随便问我:)
发布于 2019-05-21 18:26:28
不幸的是,目前还没有简单的方法来代替Web的文本输入,但是对于将来定制发送框的可能性,GitHub上有一个开放的GitHub。
尽管目前还没有一个支持的方法来替换发送框,但是有一个选项不需要分叉回购,那就是隐藏发送框,并在Web下面呈现一个自定义的发送框。但是,如果遵循这种方法,除了将Web的存储绑定到组件状态之外,还必须处理建议的操作、文件附件和语音功能。你也会失去很多网络聊天的造型选择。
如果这仍然是您想要追求的东西,这里有一些代码片段可以帮助您开始。
SimpleSendBox
import React from 'react';
import setSendBox from "botframework-webchat-core/lib/actions/setSendBox";
import submitSendBox from "botframework-webchat-core/lib/actions/submitSendBox";
export default ({ store, value }) => (
<div>
<form>
<input
onChange={ ({ target: { value }}) => store.dispatch(setSendBox(value)) }
placeholder="Type your message..."
value={ value }
/>
<button
onClick={ event => {
event.preventDefault();
store.dispatch(submitSendBox())
}}
>
Submit
</button>
</form>
</div>
)应用程序
import React, { Component } from 'react';
import WebChat from './WebChat';
import SimpleSendBox from './SimpleSendBox'
import { createStore } from 'botframework-webchat';
import './App.css';
class App extends Component {
constructor(props) {
super(props);
this.state = {
store: createStore({},
() => next => action => {
if (action.type === 'WEB_CHAT/SET_SEND_BOX') {
this.setState({ value: action.payload.text })
}
return next(action);
}),
value: ""
}
}
render() {
return (
<>
<WebChat store={ this.state.store } styleOptions={{ hideSendBox: true }} />
<SimpleSendBox store={ this.state.store } value={ this.state.value }/>
</>
);
}
}
export default App;希望这能有所帮助!
https://stackoverflow.com/questions/56234790
复制相似问题