Survey.StylesManager.applyTheme("defaultV2");
// Set up a custom component that will render React Select
class CustomSelect extends SurveyReact.SurveyQuestionDropdown {
constructor(props) {
super(props);
}
// Convert the `visibleChoices` array to a format supported by React Select
get options() {
return this.question.visibleChoices.map((c) => {
return {value: c.value, label: c.value }
});
}
// Retrieve an option object based on the question value
get selectedOption() {
return this.options.filter((o) => o.value == this.question.value);
}
// Set the question value to the selected option value
onSelectChange = (selectedOption) => {
this.setValueCore(selectedOption.value);
}
renderElement() {
// If the question is non-editable, render a stylized div
if (this.isDisplayMode) {
return (
<div id={this.question.inputId} className={this.question.getControlClass()} disabled>
{(this.question.displayValue || this.question.optionsCaption)}
</div>);
};
// Otherwise, render the React Select component
return (
<Select id={this.question.inputId}
value={this.selectedOption}
onChange={this.onSelectChange}
options={this.options}
required={this.question.isRequired}
menuPortalTarget={document.querySelector('body')} />
);
}
}
// Register the CustomSelect component as a renderer under a custom name "sv-dropdown-react"
SurveyReact.ReactQuestionFactory.Instance.registerQuestion(
"sv-dropdown-react",
(props) => {
return React.createElement(CustomSelect, props);
}
);
// Register "sv-dropdown-react" as a renderer for questions whose `type` is "dropdown" and `renderAs` property is "dropdown-react"
Survey.RendererFactory.Instance.registerRenderer(
"dropdown",
"dropdown-react",
"sv-dropdown-react"
);
var json = {
"elements": [
{
"type": "dropdown",
"name": "car",
"title": "What car are you driving?",
"isRequired": true,
"hasNone": true,
"choices": [
"Ford",
"Vauxhall",
"Volkswagen",
"Nissan",
"Audi",
"Mercedes-Benz",
"BMW",
"Peugeot",
"Toyota",
"Citroen"
],
"renderAs": "dropdown-react"
}
]
};
window.survey = new Survey.Model(json);
survey.onComplete.add(function(sender) {
document.querySelector('#surveyResult').textContent =
"Result JSON:\n" + JSON.stringify(sender.data, null, 3);
});
survey.data = { car: ['Ford'] };
ReactDOM.render(
<SurveyReact.Survey model={survey} />, document.getElementById("surveyElement"));
<!DOCTYPE html>
<html lang="en">
<head>
<title>React Select, Reactjs Survey Library Example</title>
<meta name="viewport" content="width=device-width" />
<script src="https://unpkg.com/react@17.0.1/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.1/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone@7.2.5/babel.min.js"></script>
<script src="/DevBuilds/survey-core/survey.core.min.js"></script>
<script src="/DevBuilds/survey-core/survey.i18n.min.js"></script>
<script src="/DevBuilds/survey-react-ui/survey-react-ui.min.js"></script>
<link href="/DevBuilds/survey-core/defaultV2.min.css" type="text/css" rel="stylesheet" />
<link rel="stylesheet" href="./index.css">
<script src="https://cdn.jsdelivr.net/npm/emotion@9.2.12/dist/emotion.umd.min.js"></script>
<script src="https://unpkg.com/prop-types@15.5.10/prop-types.min.js"></script>
<script src="https://unpkg.com/react-input-autosize@2.2.1/dist/react-input-autosize.min.js"></script>
<script src="https://unpkg.com/react-select@2.4.4/dist/react-select.min.js"></script>
<script src="/DevBuilds/surveyjs-widgets/surveyjs-widgets.min.js"></script>
</head>
<body style="margin: 0">
<div id="surveyElement" style="display:inline-block;width:100%;">
</div>
<div id="surveyResult"></div>
<script type="text/babel" src="./index.js"></script>
</body>
</html>
Help us serve you better by taking this brief
survey. We are interested to learn more about
your experience of using our libraries.
We'd really appreciate your feedback.
Approximate time to complete: 2 min.
Start the survey